1

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

1 回答 1

0

你忘了刷新最后一个块

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

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

于 2013-08-29T00:50:38.557 回答