【问题标题】:Different AES implementations don't agree不同的 AES 实现不一致
【发布时间】:2015-01-08 15:11:47
【问题描述】:

我必须同时使用 C# 和 Javascript 加密一段数据。我在 C# 中使用 Bouncy Castle,在 Javascript 中使用 Crypto-JS。

我面临的问题是,即使所有参数都相等(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

来自 Crypto-JS 的以下内容:578946591ce2d787cbe41bec77a58dac66e6007fb722b1af847ecc3bf4212cea

请注意前两个字节是如何相同的,但其他的都是不同的。

最重要的是,在尝试使用在线工具时,我得到了第三个输出(请参阅http://aes.online-domain-tools.com/link/bd243g1VXbD7LUAS/):57804D64A8...

我经历了几次,但我不明白为什么我得到不同的输出。

【问题讨论】:

  • 实际上,最后我确实在给定站点上得到了正确的值,但只有在确保关闭自动检测并确保 IV 由零组成......但它是为了8 位输出,因此它仍然与您给定的所有三个代码不同(当然最初的 8 位除外)。

标签: javascript c# aes bouncycastle cryptojs


【解决方案1】:

CryptoJS 似乎使用每块 128 位的输出作为密钥流。您为 Bouncy 指定每个块 16 个。由于对于 OFB 来说,每块 8 或 128 位是常见的,而且由于 128 是推荐的输出大小,我猜你只是混淆了 Bouncy 代码中的位和字节。

如果你指定new OfbBlockCipher(new AesEngine(), 128)你应该没问题。

【讨论】:

  • 在 Java 中使用 BC 对其进行了测试,通常 C# 和 Java 库具有相同的功能。我确实必须进行一些小写到大写的转换,但仅此而已……也已针对 JCE 进行了验证。
  • 哇,你说得对:)我以为这是字节数。
  • 嗯,在this one 之后,这 并不难猜 :)
  • 小更新:NIST 没有为每个块的完整块大小(AES 为 128)以外的“段大小”定义 OFB。因此,对于 OFB,使用 128 以外的任何值都不是标准化的。分段仅在当前的 CFB 规范中定义。
  • 相关:crypto.stackexchange.com/q/20183/1172请阅读有关 OFB 的部分!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多