Rijndael加密例程运行异常,解密后字节丢失的隐性Bug排查求助
问题根因
解密逻辑中读取解密后字节的时机错误:CryptoStream 处理完所有输入后,需要完成最终块的填充验证、剩余数据刷入底层流的操作,这个操作默认是在 CryptoStream 被释放(即退出using块)时才会执行。你现在在 cryptoStream 的using块内部就调用 memoryStream.ToArray(),此时最后一块解密后的数据还没写入MemoryStream,自然会出现字节丢失。
修复方案
只需要把解密阶段读取decryptedBytes的代码移到cryptoStream的using块外面即可,修改后的解密部分代码如下:
var dec = cipher.CreateDecryptor(_key, _IV); using (var memoryStream = new MemoryStream()) { using (var cryptoStream = new CryptoStream(memoryStream, dec, CryptoStreamMode.Write)) { cryptoStream.Write(cipherBytes, 0, cipherBytes.Length); } // 等CryptoStream释放完成后再读取全量解密字节 decryptedBytes = memoryStream.ToArray(); }
补充说明
如果需要在不释放CryptoStream的情况下主动触发最终块处理,也可以在写完密文后主动调用 cryptoStream.FlushFinalBlock() 后再读字节,不过更推荐上述写法,靠using的释放逻辑自动处理更稳妥,避免漏调用。
内容的提问来源于stack exchange,提问作者ActiveX
相关产品推荐
相关产品推荐

