RSA加密/解密的结果带有3个问号

imo*_*t01 1 c# cryptography rsa

我正在使用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);
    }
}
Run Code Online (Sandbox Code Playgroud)

Ste*_*tty 5

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

string msg = Encoding.ASCII.GetString(decrypted);
Run Code Online (Sandbox Code Playgroud)

string msg = Encoding.UTF8.GetString(decrypted);
Run Code Online (Sandbox Code Playgroud)

问号由文本前面的字节顺序标记(BOM)生成。对于不需要BOM的UTF-8并不常见。对于UTF-16来说,字节序是个问题,但这种情况更为常见,但是由于其余的纯文本似乎都已解码为ASCII,因此无法对其进行UTF-16编码。

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