OK、ここでの私の必要性は、リッチテキストボックスに入力されたものをファイルに保存して暗号化し、ファイルからテキストを再度取得してリッチテキストボックスに表示することです。これが私の保存コードです。
private void cmdSave_Click(object sender, EventArgs e)
{
FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.Write);
AesCryptoServiceProvider aes = new AesCryptoServiceProvider();
aes.GenerateIV();
aes.GenerateKey();
aes.Mode = CipherMode.CBC;
TextWriter twKey = new StreamWriter("key");
twKey.Write(ASCIIEncoding.ASCII.GetString(aes.Key));
twKey.Close();
TextWriter twIV = new StreamWriter("IV");
twIV.Write(ASCIIEncoding.ASCII.GetString(aes.IV));
twIV.Close();
ICryptoTransform aesEncrypt = aes.CreateEncryptor();
CryptoStream cryptoStream = new CryptoStream(fs, aesEncrypt, CryptoStreamMode.Write);
richTextBox1.SaveFile(cryptoStream, RichTextBoxStreamType.RichText);
}
キーとivをファイルに保存することによるセキュリティへの影響は知っていますが、これはテストのためだけです:)
さて、保存部分は正常に機能します。つまり、例外はありません...ファイルはfilePathで作成され、キーファイルとIVファイルも正常に作成されます...
私が立ち往生している部分を取得するために今OK:S
private void cmdOpen_Click(object sender, EventArgs e)
{
OpenFileDialog openFile = new OpenFileDialog();
openFile.ShowDialog();
FileStream openRTF = new FileStream(openFile.FileName, FileMode.Open, FileAccess.Read);
AesCryptoServiceProvider aes = new AesCryptoServiceProvider();
TextReader trKey = new StreamReader("key");
byte[] AesKey = ASCIIEncoding.ASCII.GetBytes(trKey.ReadLine());
TextReader trIV = new StreamReader("IV");
byte[] AesIV = ASCIIEncoding.ASCII.GetBytes(trIV.ReadLine());
aes.Key = AesKey;
aes.IV = AesIV;
ICryptoTransform aesDecrypt = aes.CreateDecryptor();
CryptoStream cryptoStream = new CryptoStream(openRTF, aesDecrypt, CryptoStreamMode.Read);
StreamReader fx = new StreamReader(cryptoStream);
richTextBox1.Rtf = fx.ReadToEnd();
//richTextBox1.LoadFile(fx.BaseStream, RichTextBoxStreamType.RichText);
}
ただし、 「パディングは無効であり、削除できません」richTextBox1.Rtf = fx.ReadToEnd();
という暗号化例外がスローされます。
一方、 NotSupportedException「ストリームはシークをサポートしていません。」richTextBox1.LoadFile(fx.BaseStream, RichTextBoxStreamType.RichText);
をスローします。
暗号化されたファイルからデータをロードしてリッチテキストボックスに表示するために何ができるかについての提案はありますか?