【问题标题】:Result of RSA encryption/decryption has 3 question marksRSA加密/解密结果有3个问号
【发布时间】:2013-05-08 21:32:44
【问题描述】:

我正在使用 RSA 加密和解密 1 或 2 个单词的小记事本文件。处理后的文件结果请求结果上有3个问号。

例如,如果我加密然后解密带有单词“Hello”的记事本文件,结果将是“???Hello”。那三个问号是哪里来的?

这是代码:

    public partial class Form1 : Form
{

    private RSAParameters publicKey;
    private RSAParameters privateKey;

    public string result;

    public Form1()
    {
        InitializeComponent();
        var rsa = new RSACryptoServiceProvider();
        this.publicKey = rsa.ExportParameters(false);
        this.privateKey = rsa.ExportParameters(true);
    }

    private void button1_Click(object sender, EventArgs e)
    {
        openFileDialog1.ShowDialog();
    }

    private void openFileDialog1_FileOk(object sender, CancelEventArgs e)
    {
        textBox1.Text = openFileDialog1.FileName;
    }

    private void button2_Click(object sender, EventArgs e)
    {
        FileStream fileStream = new FileStream(textBox1.Text, FileMode.Open);

        byte[] buffer = new byte[fileStream.Length];
        int len = (int)fileStream.Length;
        fileStream.Read(buffer, 0, len);

        var rsa = new RSACryptoServiceProvider();
        rsa.ImportParameters(publicKey);

        var encrypted = rsa.Encrypt(buffer, false);

        result = Convert.ToBase64String(encrypted);
        MessageBox.Show(result);
    }

    private void button3_Click(object sender, EventArgs e)
    {

        var rsa = new RSACryptoServiceProvider();
        rsa.ImportParameters(privateKey);

        byte[] toDecode = Convert.FromBase64String(result);

        var decrypted = rsa.Decrypt(toDecode, false);

        string msg = Encoding.ASCII.GetString(decrypted);
        MessageBox.Show(msg);
    }
}

【问题讨论】:

  • 您的“简单文本文件”中有一个BOM,它正在显示。尝试不要通过任何加密,并在阅读后仅显示文件

标签: c# cryptography rsa


【解决方案1】:

您的输入文件编码很可能是 UTF8,而您正在将其解码为 ASCII。尝试改变

string msg = Encoding.ASCII.GetString(decrypted);

string msg = Encoding.UTF8.GetString(decrypted);

问号由文字前面的Byte Order Mark (BOM) 生成。不需要 BOM 的 UTF-8 并不常见。 UTF-16 更常见,其中字节顺序是一个问题,但由于纯文本的其余部分似乎解码为 ASCII,因此不能进行 UTF-16 编码。

请注意,ASCII 不能显示任何值为 127(十六进制为7F)或更高的字符。 .NET 平台似乎默默地用问号替换了 BOM 值。

【讨论】:

  • +1 很抱歉之前的评论,我完全不知道有类似 UTF-8 BOM 的东西。
  • 已编辑的答案包括 Mike Vine 的评论以弥补它:)
猜你喜欢
  • 1970-01-01
  • 2018-09-10
  • 2012-03-13
  • 2015-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-27
  • 2011-01-29
相关资源
最近更新 更多