文档从未真正提及原因CryptoStream
应该使用而不是TransformBlock
and TransformFinalBlock
除此之外,它会自动调用所需的任何一个。
因此,为什么要使用这个答案中的代码(https://stackoverflow.com/a/2006922/7343355)而不是这个:
using (var encryptor = aes.CreateEncryptor())
{
result = encryptor.TransformFinalBlock(data, 0, data.Length); // Data length is greater than the blocksize
}
虽然TransformFinalBlock
应该在之后使用TransformBlock
仅在最后一个块上,这段代码以某种方式通过了所有单元测试,并且总是给出正确的结果。有没有可能失败的情况?这和我使用有关系吗ECB
密码模式来测试这个并且在其他模式下会失败吗?
之所以CryptoStream
is 一般来说首选的是它更普遍适用。它用于通常涉及大量数据的对称加密。出于实际原因(例如限制内存使用),将整个待加密内容和加密输出同时全部存储在内存中可能不切实际。
因此,您可能已经在使用流,例如NetworkStream
or FileStream
. CryptoStream
自然地与这些其他流组合得很好,因此您通常最终会构建一个pipeline(或者可能有两个CopyTo
or CopyToAsync
弥合“读”侧和“写”侧之间的差距)。
If您所处的位置是,要加密的全部内容很小并且已经在内存中,因此您还能够处理内存中的整个加密输出,那么当然,您可以使用TransformFinalBlock
反而。而且您将为自己节省一些对象分配(但我们已经说过,如果我们在这里,内存使用不是问题......),代价是现在必须完全用两个之一编写您的加密代码根据每个用例的不同方式。
Meta bit
不幸的是,我们在问题中得到的玩具示例(“类似......”或实际的 MCVE)看起来像是适合第二种情况。但大多数回答此类问题的人都会认为代码需要处理与第一个更相似的情况,因此他们仍然会提供CryptoStream
基于解决方案,即使TransformFinalBlock
一个适用于代码在问题中.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)