AES计数器模式C#等效

时间:2011-03-24 00:41:08

标签: c# javascript aes

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

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

我想避免移植代码; - )

提前致谢

3 个答案:

答案 0 :(得分:10)

唉, System.Security.Cryptography命名空间中的CTR mode is not implemented as a "mode" in the builtin AES class

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

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

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

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


另一方面,如果您只是想让Javascript和C#与AES互操作,并且您并不特别坚持使用CTR模式,那么您可以非常轻松地使用ECB模式。 This question向您展示了如何让SlowAES和.NET的Aes类协同工作,它包含指向工作代码(Javascript,C#和VB)的链接。 But be careful about ECB mode

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

祝你好运。

答案 1 :(得分:2)

I don't have enough points to reply to Cheeso's answer, but I do not believe this is accurate, "If the app asks to encrypt 10 bytes, you can't encrypt."

Since CTR mode encrypts the nonce, and then XORs the result with clearText, you can encrypt blocks of any size. That's actually one of the primary benefits of CTR mode, along with parallel encryption.

答案 2 :(得分:-2)

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

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

相关问题