c# - C# 和 Java 之间的 AES/CBC/NoPadding

标签 c# java encryption aes

我在 C# 和 Java 中使用了一些加密函数,它们的输出似乎不匹配。我正在输入与测试相同的 key 和 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”,因此它看起来接近但略有偏差。

在加密步骤之前,我已经检查过 key 、输入和 IV 的字节是否匹配。是否有任何其他差异会导致差异?

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

081821ab6599650b4a31e29994cb130203e0d396a1d375c7d1c05af73b44a86f

所以也许有人正在读取的 key 或 IV 有问题......

最佳答案

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

关于c# - C# 和 Java 之间的 AES/CBC/NoPadding,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18118291/

相关文章:

javascript - javascript : cipher broken 中的凯撒密码

c# - 使用 c# 在没有注册表的情况下禁用 Ctrl 或 Alt 键

c# - 如何拥有 C# 只读功能但不限于构造函数?

java - 数据处理平衡

java - 如何用二叉搜索树中的节点元素按升序填充数组?

php - 今天(2016 年 5 月)PHP password_hash() + password_verify() 安全吗?

security - 是否可以使用 64 位 I/O block 大小来实现 AES?

c# - 匿名类型的 Asp.net WebForms 错误

c# - 在什么情况下我会将操作指定为未选中?

Java如何从网站获取字符串