1

RSA を使用して、1 語または 2 語の小さなメモ帳ファイルを暗号化および復号化しています。ファイルの結果を処理した後、結果の開始時に 3 つの疑問符が表示されます。

たとえば、「He​​llo」という単語が含まれるメモ帳ファイルを暗号化してから復号化すると、結果は「???Hello」になります。その 3 つのクエスチョン マークはどこから来たのですか?

これはコードです:

    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);
    }
}
4

1 に答える 1

5

入力ファイルのエンコーディングが UTF8 で、ASCII にデコードしている可能性があります。変更してみる

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

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

疑問符は、テキストの前にあるバイト オーダー マーク (BOM)によって生成されます。BOM を必要としない UTF-8 では珍しいことです。エンディアンが問題となる UTF-16 ではより一般的ですが、残りのプレーン テキストは ASCII にデコードされるように見えるため、UTF-16 でエンコードすることはできません。

7FASCII では、値が 127 ( 16 進数) 以上の文字は表示できないことに注意してください。.NET プラットフォームは、BOM 値を暗黙のうちに疑問符に置き換えているようです。

于 2013-05-08T21:36:26.083 に答える