MemoryStream-> ToArray()返回null

时间:2013-08-28 19:06:55

标签: visual-studio-2010 visual-c++ encryption aes msdn

我正在尝试使用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();

1 个答案:

答案 0 :(得分:0)

你忘了flush the final block

分组密码模式通常需要写入完整的块。最后一个块包含填充,并且实现仅在接收到明文的最后一个字节时才将填充添加到纯文本。它无法确定Write之后是否有任何数据进入,因此无法填充。因此,最后 - 也可能只是 - 密文块不会被写入。

只是刷新不起作用,因为这只能确保尽可能多的字节写入输出流。但那些字节可能不是最后的字节。关闭输出流也应该可以正常工作,因为流可以确定已写入最后一个字节。