.NET的CryptoStream有可寻址的替代方案吗?

3

有没有人知道一种可寻址的替代方案,可以替代.NET的CryptoStream?

如果这个替代方案只支持“读”模式下的寻址,或者仅限于AES256,也是可以接受的。

3个回答

4

块加密是完全安全的。问题在于ECB模式。使用OFB或CTR模式可以编写实现。但是,我从未找到过这样的实现。可能会下定决心去写它...

更新:

所以我确实写了一个实现。由于各种原因,我现在不打算在这里发布它(我会尝试在某个时候发布),但是以下是一些指针供任何想要执行此操作的人参考:

使用RijndaelManaged变换的CBC模式。您将逐块计算密码流。可以通过在转换中初始化密钥和空(全零)IV来完成此操作-实际IV将基于块计算。

您需要有一个方法,通过连接或以其他方式计算nonce加IV加计数器来计算当前块的输入。您可以在此处进行多个优化,包括预先计算nonce和iv(此方法将被调用多次,因此值得这样做)。

例如:byte [] GetCurrentCounterBlock(byte [] nonce,byte [] iv,UInt32 counter)

(注意:此处的“iv”是指NIST所称的IV,即整个块的中间部分,其他人称其为集体IV)

您将在循环内使用此方法对数据进行加密-第一次调用,然后在块边界处连续调用以更新当前密码流。此方法为变换的TransformBlock方法提供输入。获取变换的输出并将结果与当前数据块进行异或运算。每次加密块后使用transform.Reset()!否则,CBC将尝试使用变换的输出作为下一个输入。可能有更聪明的方法可以在.NET中实现这一点,但我想不出来。我知道BouncyCastle支持OFB“本地”,因此可能是更好的选择,但这是一种很快的方法,可以获得高度可重用的加密流而无需外部依赖。

总之,关键在于整个方法(我称其为AesCtr256.Process-但您可以轻松地更通用)适用于密码流内任意范围的数据。您可以轻松地在自定义流类中使用此方法。这将允许在读取和写入时寻找流内的任意位置,并为您提供字节对齐的数据(非常好,因为现在您可以拥有实际报告真实数据长度的加密流!)。

换句话说,您计算密码流以覆盖流的任意部分,然后只需针对密码或纯文本进行异或以进行加密/解密。

最后两件事:1.)我强烈建议在流的生命周期内重复使用变换-创建这些变换是昂贵的。2.)如果您要执行此操作,请针对NIST向量或类似向量编写单元测试。不要假设您已经正确地完成了此操作-仅因为输出看起来随机,这并不意味着已正确加密:)。

如果有任何更好的方法,或者我在一段非常关键的代码中犯了错误,请发表您的想法。谢谢!

2

我看到了问题。然而,似乎有几种方法可以实现安全的分块加密,例如TrueCrypt使用的http://en.wikipedia.org/wiki/Disk_encryption_theory#XTS。 - Stefan Schultze
1
磁盘加密独立地加密每个块,这就是它获得随机查找的方式。 - Barry Kelly

0

这是一个重复的问题。我在这里放了一个答案: 如何向CryptoStream添加查找和定位功能

即使它使用ECB,但你可以使用任何其他算法。顺便说一下,它没有ECB问题,因为它使用了不同的ECB方式。


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