【问题标题】:AES/CBC/NoPadding between C# and JavaC# 和 Java 之间的 AES/CBC/NoPadding
【发布时间】:2013-08-08 05:09:33
【问题描述】:

我在 C# 和 Java 中使用了一些加密函数,其输出似乎不匹配。我正在输入与测试相同的键和 IV 字符串。

输入字符串:“&app_version=1.0.0.0”

Java:

SecretKeySpec keyspec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes("UTF-8"));

Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);
byte[] encrypted = cipher.doFinal(input.getBytes("UTF-8"));

// Then I convert encrypted to hex by building a string of encrypted[i] & 0xFF

输出:

60f73a575b647263d75011bb974a90e85201b8dfeec6ec8ffba04c75ab5649b3

C#:

SymmetricKeyAlgorithmProvider alg = SymmetricKeyAlgorithmProvider.OpenAlgorithm(SymmetricAlgorithmNames.AesCbc);

BinaryStringEncoding encoding = BinaryStringEncoding.Utf8;

// Create key and IV buffers
IBuffer keyBuffer = CryptographicBuffer.ConvertStringToBinary(key, encoding);
CryptographicKey cKey = alg.CreateSymmetricKey(keyBuffer);
IBuffer ivBuffer = CryptographicBuffer.ConvertStringToBinary(iv, encoding);

// Create input text buffer
IBuffer inputBuffer = CryptographicBuffer.ConvertStringToBinary(input, encoding);
// Do the encryption
IBuffer encryptedBuffer = CryptographicEngine.Encrypt(cKey, inputBuffer, ivBuffer);

// Convert encrypted back to hex
string encryptedStr = CryptographicBuffer.EncodeToHexString(encryptedBuffer);

输出:

4b6fd83c35565fc30a9ce56134c277cbea74d14886cf99e11f4951075d4f4505

我正在使用 Java 解密器进行检查,它正确地解密了 Java 加密的字符串,但 C# 字符串被读取为“&app_version=1Q0.0.0”,因此看起来很接近但略有偏差。

我在加密步骤之前检查了密钥、输入和 IV 的字节是否匹配。是否还有其他会导致差异的差异?

编辑 使用全零键 "00000000000000000000000000000000" 和 IV "0000000000000000" 我得到了 Java 和 C# 相同的输出:

081821ab6599650b4a31e29994cb130203e0d396a1d375c7d1c05af73b44a86f

所以也许人们正在阅读的密钥或 IV 有问题......

【问题讨论】:

  • 能否发布您的 java 代码和 C# 代码的输出数据?
  • 解密时添加的输出和预期值与实际值
  • AES 在没有填充的 CBC 模式下仅在输入大小是块大小(16 字节,128 位)的倍数时才有效。你能验证数据的大小是否正确吗?如果提供非标准输入数据,密码的行为可能会出乎意料。此外,为了排除故障,请尝试使用全零 IV。
  • 我正在填充以便输入是 16 的倍数。我确实尝试了 0 的键和 IV 并得到相同的输出,将添加到原始问题
  • 通过将键设置为“正常”值(保持 IV 全为零)来进一步缩小范围。如果它产生不同的值,请在 CBC 内使用 ECB 重试。我对 C# 不是很熟悉,但代码看起来合乎逻辑。

标签: c# java encryption aes


【解决方案1】:

我觉得自己像个傻瓜……我的 IV 包含一个 0 和一个大写 O!好吧,至少我知道这段代码是等价的。

【讨论】:

  • 哈哈!至少你发现了你的问题。当你说密钥没问题时,我怀疑 IV 或 C# 的 AES 实现有问题。
猜你喜欢
  • 1970-01-01
  • 2015-11-11
  • 1970-01-01
  • 2021-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多