可以替代.NET的CryptoStream?

时间:2009-08-23 08:47:28

标签: c# .net seek aescryptoserviceprovider cryptostream

有人知道.NET的CryptoStream的可替代替代品吗?

如果备选方案仅支持在“读取”模式下搜索或者仅限于例如AES256。

2 个答案:

答案 0 :(得分:4)

分块加密非常安全。这只是欧洲央行的问题。可以使用OFB或CTR模式编写实现。但是,我从未设法找到一个。可以咬紧牙关写下来......

更新:

所以我写了一个这样的实现。出于各种原因,我现在不打算在这里发布(我会尝试在某些时候),但这里有一些指针可供任何想要这样做的人:

在CBC模式下使用RijndaelManaged转换。你将逐块计算密码流。您可以通过在变换中初始化一个键和一个空(全零)iv来实现这一点 - 实际的iv将逐块计算。

您需要一种方法,通过连接或以其他方式计算nonce加iv加计数器来计算当前块的输入。您可以在此处进行多项优化,包括预先计算nonce& iv(这种方法会被多次调用,所以它可能是值得的。)

e.g。 byte [] GetCurrentCounterBlock(byte [] nonce,byte [] iv,UInt32 counter)

(注意:“iv”在这里我指的是NIST所谓的IV,整个区块的中间部分,其他人统称为IV)

你将在一个循环中使用这个方法来加密你的数据 - 第一次调用它,然后在块边界调用以更新当前的密码流。此方法提供转换的TransformBlock方法的输入。获取转换的输出,并将结果与​​当前数据块进行异或。每个块加密后使用transform.Reset()!否则,CBC将尝试使用转换的输出作为下一个输入。使用.NET可能有更聪明的方法来做到这一点,但我无法弄明白。我知道BouncyCastle“原生”支持OFB,所以这可能是一个更好的选择,但这是一个很好的快速方法来获得一个没有外部代表的高度可重用的cryptostream。

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

换句话说,你计算流的任意部分的密码流,然后简单地对密码或纯文本进行加密/解密。

最后两件事:1。)我强烈建议在流的生命周期中重复使用转换 - 创建这些转换是很昂贵的。 2.)如果你打算对NIST向量或类似的实现这个写单元测试。不要以为你做对了 - 只是因为输出看起来是随机的,并不意味着它被正确加密:)。

如果有人对更好的方法有任何想法,或者我如何完全删除一段非常关键的代码,请发帖,谢谢!

答案 1 :(得分:2)

我认为这样的实现不会非常有用,因为Seek操作只能在(相对地,取决于算法)ECB样式链的恒定时间内执行,即单独加密块 - 而{ {3}}

对我来说,通过复制进出MemoryStream或类似的包装技术,你会感觉更好。