我正在使用RSA来加密和解密带有1或2个字的小记事本文件。处理后的文件结果在结果的乞讨上有3个问号。
例如,如果我加密然后用其中的单词“Hello”解密记事本文件,结果将是“??? 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);
}
}
答案 0 :(得分:5)
您的输入文件编码很可能是UTF8,并且您将其解码为ASCII。尝试更改
string msg = Encoding.ASCII.GetString(decrypted);
到
string msg = Encoding.UTF8.GetString(decrypted);
问号由文本前面的Byte Order Mark (BOM)生成。 UTF-8不需要BOM就不常见了。 UTF-16更常见的是字节序是一个问题,但由于纯文本的其余部分似乎解码为ASCII,因此不能进行UTF-16编码。
请注意,ASCII不能显示值为127(十六进制为7F
)或更高的任何字符。 .NET平台似乎默默地用问号替换BOM值。