不同的AES实现;我不同意
本文关键字:我不同意 实现 AES | 更新日期: 2023-09-27 18:30:12
我必须使用C#和Javascript来加密一段数据。我在C#中使用Bouncy Castle,在Javascript中使用CryptoJS。
我面临的问题是,即使所有参数都相等(OFB没有填充,IV总是0),我也无法获得两个库的相同输出。这样做的结果也是,我无法用一个解密用另一个加密的东西。
这是我加密的C#代码:
byte[] iv = new byte[16];
BufferedBlockCipher aes = new BufferedBlockCipher(new OfbBlockCipher(new AesEngine(), 16));
ParametersWithIV ivAndKey = new ParametersWithIV(new KeyParameter(stretchedKey), iv);
aes.Init(true, ivAndKey);
int minSize = aes.GetOutputSize(privateKey.Length);
byte[] outBuf = new byte[minSize];
int length1 = aes.ProcessBytes(privateKey, 0, privateKey.Length, outBuf, 0);
int length2 = aes.DoFinal(outBuf, length1);
byte[] encryptedKey = iv.Concat(outBuf.Take(length1 + length2)).ToArray();
我的Javascript代码如下所示用于加密(请在JSFiddle上尝试:http://jsfiddle.net/gCHAG/424/):
var key = Crypto.util.hexToBytes('59b50e345cab8b6d421b161918ea3fbd7e5921eea7d43d1ac54fa92cca452bb5');
var iv = Crypto.util.hexToBytes('00000000000000000000000000000000');
var message = Crypto.util.hexToBytes('3b16601d0a7e283c1f24d30ec214676885096cb0bbf3998012a2be87c5a58d89');
var encrypted = Crypto.AES.encrypt(message, key, { iv: iv, asBytes: true, mode: new Crypto.mode.OFB(Crypto.pad.NoPadding) });
我从弹性城堡实现中得到以下内容:578934dbb576dc986a531f09e8d5abd5b01dc1bfd3ededd222ff8aa6e4bfdbf2
以下来自CryptoJS:578946591ce2d787cbe41bec77a58dac66e6007fb722b1af847ecc3bf4212cea
注意前两个字节是相同的,但其他的都不同。
为了补充这一切,当尝试在线工具时,我会得到第三个输出(请参阅http://aes.online-domain-tools.com/link/bd243g1VXbD7LUAS/):57804D64A8...
我把每件事都经历了好几次,但我不明白为什么我会得到不同的结果。
CryptoJS似乎对密钥流使用了每个块128位的输出。为"反弹"指定每个块16个位。由于每个块8或128位对于OFB是常见的,并且由于128是建议的输出大小,我猜您只是混淆了Bouncy代码中的位和字节。
如果您指定new OfbBlockCipher(new AesEngine(), 128)
,则应该是OK。