为什么要使用CryptoStream而非TransformBlock?

3

文档从未真正提到为什么应该使用CryptoStream而不是TransformBlockTransformFinalBlock,除了它会自动调用所需的方法。

因此,为什么要使用此答案中的代码(https://dev59.com/C3I-5IYBdhLWcg3wHUnP#2006922)而不是这个:

using (var encryptor = aes.CreateEncryptor())
{
    result = encryptor.TransformFinalBlock(data, 0, data.Length); // Data length is greater than the blocksize
}

尽管应该在TransformBlock之后,仅在最后一个块上使用TransformFinalBlock,但不知何故,这段代码通过了所有的单元测试并且总是给出了正确的结果。是否存在任何可能会失败的情况?这是否与我使用ECB密码模式进行测试有关,并且在其他模式下会失败?
1个回答

4
通常情况下,CryptoStream更受青睐的原因是它具有更广泛的适用性。它用于对称加密,这通常涉及大量数据。出于实际原因(例如限制内存使用),将整个要加密的内容和加密输出同时存储在内存中可能不可行。
因此,您可能已经在使用其他流,例如NetworkStreamFileStreamCryptoStream自然地与这些其他流组合良好,因此您经常会构建一个管道(或者使用CopyToCopyToAsync在“读”侧和“写”侧之间架起桥梁)。 如果您处于要加密的整个内容较小且已在内存中的位置,并且因此也能够处理整个加密输出,则可以只使用TransformFinalBlock。这样做可以节省一些对象分配(但是我们已经说过,如果我们在这里,内存使用不是问题...),但代价是现在必须根据每种用例以两种完全不同的方式编写加密代码。
元信息 不幸的是,在问题中得到的玩具示例(“类似于...”或实际的MCVE)看起来像符合第二种情况。但是,大多数回答此类问题的人会假定代码需要处理更类似于第一种情况的情况,因此即使TransformFinalBlock也可以用于问题中的代码,他们仍然会提供基于CryptoStream的解决方案。

1
所以,如果我们有整个数据...那么我们可以直接使用TransformFinalBlock()而不是CryptoStream。 - Jitendra
1
@Damien_The_Unbeliever 那么...你是说,TransformBlockTransformFinalBlock是基于数组处理少量数据的,而CryptoStream是基于流处理大量数据的块? - Suncat2000

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接