我正在尝试使用AES 128 CBC加密字符串,我一直在关注MSDN示例: http://msdn.microsoft.com/en-us/library/system.security.cryptography.aesmanaged.aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-2
但是当我这样做时:
encKey = msEncrypt->ToArray();
调试时我的数组长度为零。为什么encKey数组没有加密输出? 实施守则:
ICryptoTransform^ encryptor = encAES->CreateEncryptor();
MemoryStream^ msEncrypt = gcnew MemoryStream();
CryptoStream^ csEncrypt = gcnew CryptoStream(msEncrypt, encryptor, CryptoStreamMode::Write);
StreamWriter^ swEncrypt = gcnew StreamWriter(csEncrypt);
swEncrypt->Write(publicKey);
encKey = msEncrypt->ToArray();
感谢您的帮助。
解决方案:
ICryptoTransform^ encryptor = encAES->CreateEncryptor();
MemoryStream^ msEncrypt = gcnew MemoryStream();
CryptoStream^ csEncrypt = gcnew CryptoStream(msEncrypt, encryptor, CryptoStreamMode::Write);
StreamWriter^ swEncrypt = gcnew StreamWriter(csEncrypt);
swEncrypt->Write(publicKey);
swEncrypt->Close();
csEncrypt->Close();
encKey = msEncrypt->ToArray();
msEncrypt->Close();
答案 0 :(得分:0)
分组密码模式通常需要写入完整的块。最后一个块包含填充,并且实现仅在接收到明文的最后一个字节时才将填充添加到纯文本。它无法确定Write
之后是否有任何数据进入,因此无法填充。因此,最后 - 也可能只是 - 密文块不会被写入。
只是刷新不起作用,因为这只能确保尽可能多的字节写入输出流。但那些字节可能不是最后的字节。关闭输出流也应该可以正常工作,因为流可以确定已写入最后一个字节。