【问题标题】:MemoryStream->ToArray() returning nullMemoryStream->ToArray() 返回 null
【发布时间】:2013-08-28 19:06:54
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    你忘了flush the final block

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

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

    【讨论】:

    • 嗨,carbon,您在阅读我的回答后解决了这个问题吗?
    • 我相信它做到了!谢谢,我想知道为什么这个例子不包括冲洗。编辑:对不起,我不能投票给你。
    • 我在 encKey = msEncrypt->ToArray() 之前将 swEncrypt->Flush() 替换为 swEncrypt->Close() 似乎 Flush 没有写入填充信息。
    • @carbon 我会调整答案,链接指向正确的“最终”刷新方法,但这并不清楚。关闭流无疑也调用了这个方法。如果您只刷新,那么输出流仍然需要更多字节,因此它还不能填充...
    猜你喜欢
    • 1970-01-01
    • 2020-05-22
    • 2012-07-16
    • 2023-03-30
    • 1970-01-01
    • 2011-08-04
    • 2013-01-15
    • 2018-12-17
    • 2010-12-12
    相关资源
    最近更新 更多