gpt4 book ai didi

c# - .NET 的 CryptoStream 的可寻找替代品?

转载 作者:行者123 更新时间:2023-11-30 14:43:54 26 4
gpt4 key购买 nike

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

如果替代方案仅支持“读取”模式下的搜索,或者它仅限于例如AES256.

最佳答案

按 block 加密非常安全。只是欧洲央行有问题。可以使用 OFB 或 CTR 模式编写实现。但是,我从来没有设法找到一个。可能硬着头皮写了...

更新:

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

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

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

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

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

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

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

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

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

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

关于c# - .NET 的 CryptoStream 的可寻找替代品?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1318094/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com