繁体   English   中英

AES计数器模式C#等效

[英]AES Counter mode C# equivalent

我使用以下javascript来加密一些数据: http//www.movable-type.co.uk/scripts/aes.html

我必须用C#解密它。 有人知道如何用Rijndael经理解密吗?

我想避免移植代码;-)

提前致谢

唉, CTR模式未在System.Security.Cryptography命名空间中的内置AES类实现为“模式”

但是,有一个解决方案。 使用在ECB模式下运行的内置AES类,全零的IV,无填充和一些调整,CTR模式并不太难实现。 基本上,对于每个块,CTR模式对计数器进行加密,然后使用明文对该加密的结果进行异或,以获得密文。 那是加密。 你可以进行解密。 由于转换操作是异或,它是自反的,因此解密与加密真的相同。

对于第一个16字节的块(AES的块大小),从零开始计数器; 递增每个后续块的计数器。

老实说,关于整个事件最棘手的部分是将要加密的数据分割成16个字节的块。 如果应用程序要求加密10个字节,则无法加密。 在进行转换之前,您需要等待直到获得完整的16个字节。 所以你需要管理一个缓冲区。

我没有适合您的工作代码演示,但鉴于此描述,构建适合您的CTR模式应该不会太难。 您可以在WinZipAes.cs模块中看到基于内置AES类的CTR模式加密示例, 该模块是开源DotNetZip库的一部分。 此代码确实有效,但尚未准备好在DotNetZip之外使用。 您需要重新包装它以使其清洁。


另一方面,如果您只是想让Javascript和C#与AES互操作,并且您并不特别坚持CTR模式,那么您可以非常轻松地使用ECB模式。 这个问题向您展示了如何让SlowAES和.NET的Aes类一起工作,它包含指向工作代码(Javascript,C#和VB)的链接。 但要注意ECB模式

这是一个与您选择的Javascript库不同的Javascript库; 我更喜欢slowAES,因为它对我来说更有意义。 另外,在那个答案中,我提供了支持类,如RFC2898基于密码的密钥派生。

祝好运。

我没有足够的积分回答Cheeso的答案,但我不相信这是准确的,“如果应用程序要求加密10个字节,则无法加密。”

由于CTR模式对nonce进行加密,然后使用clearText对结果进行异或,因此可以加密任意大小的块。 这实际上是CTR模式的主要优点之一,以及并行加密。

您可能还希望确保您对AES ECB块的输入是随机IV和字节偏移的组合。 例如,高92位是随机IV(每个文件不同),低32位是您的字节偏移。

对每个文件加密使用IV为0是危险的。 (请参阅“编写安全代码”,第285页,第2版)。 改变每个加密操作的密钥和IV。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM