代码之家  ›  专栏  ›  技术社区  ›  Stefan Schultze

可以替代.NET的加密流吗?

  •  3
  • Stefan Schultze  · 技术社区  · 16 年前

    有没有人知道.NET加密流的一个看似可行的替代方案?

    如果备选方案仅支持“读取”模式下的搜索,或者仅限于AES256,则可以。

    3 回复  |  直到 16 年前
        1
  •  4
  •   Jeff    13 年前

    分块加密是完全安全的。只是欧洲央行有问题。实现可以使用ofb或ctr模式编写。但是,我从来没有找到过。可能会咬紧牙关写出来。。。

    更新:

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

    在cbc模式下使用rijndaelmanaged转换。你要一块一块地计算密码流。您可以通过在转换中初始化一个密钥和一个空的(全部为零)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,所以这可能是一个更好的选择,但这是一个很好的快速方法,可以在没有外部dep的情况下获得高度可重用的加密流。

    不管怎样,关键是整个方法(我称之为AesCtr256.Process——但您可以很容易地更通用)可以处理密码流中任意范围的数据您可以在自定义流类中轻松使用此方法这将允许在读写操作中查找流中的任意位置,并为您提供与字节对齐的数据(非常好,因为您现在可以拥有一个实际报告真实数据长度的加密流!).

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

    最后两件事:1)我强烈建议在流的生命周期中重用转换——创建这些转换非常昂贵。2)如果你要实现这个 根据nist向量或类似的向量编写单元测试 是的。不要以为你是对的——仅仅因为输出看起来是随机的,并不意味着它被正确地加密了:)。

    如果有人对更好的方法有任何想法,或者我是如何完全弄糟了一段非常关键的代码,请张贴,谢谢!

        2
  •  2
  •   Barry Kelly    16 年前

    我认为这样的实现不会很有用,因为 Seek 操作只能在(相对而言,取决于算法)具有ecb式链接的恒定时间内执行,即分别加密块-这是 highly unrecommended - see the image in this Wikipedia article for a startling example of insecurity 是的。

    在我看来,你最好抄进/抄出 MemoryStream 或类似的包装技术。

        3
  •  0
  •   Community Mohan Dere    9 年前

    这是一个重复的问题。我回答说: How to add seek and position capabilities to CryptoStream

    甚至它也在使用ecb,但您可以使用任何其他算法。顺便说一下,它没有巴里凯利(Barry Kelly)提到的欧洲央行问题,因为它使用欧洲央行的方式不同。

    推荐文章