我正在连接到一个旧版 Java 应用程序(该应用程序无法更改),该应用程序使用 AES 加密数据。以下是原始 Java 代码实例化 AES 密码的方式:
SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec );
我是一名 C/C++ 开发人员,而不是 Java 开发人员,但据我所知,这段遗留 Java 代码没有指定模式,也没有指定初始化 vector 。有人知道 Java 默认使用什么,因为它没有指定吗?
我们需要新的 C/C++ 应用程序来解密 Java 加密的数据。但我不知道如何使用 OpenSSL 的初始化 vector 和链接模式,因为我不知道 java 是做什么的。
最佳答案
找到可能的答案:
"By default, Java Ciphers (at least in Sun's implementations) are constructed in what is called Electronic Codebook (ECB) mode." (Source: http://www.javamex.com/tutorials/cryptography/block_modes.shtml)
因此,如果默认使用 ECB,我想这意味着没有初始化 vector ,我可以使用 OpenSSL 中的以下方法:
void AES_ecb_encrypt(*in, *out, *key, enc);
使用 AES_decrypt()
我可以解密源自 Java 端的 1000 多个字节消息。所以看起来 Java 确实默认为没有初始化 vector 的 ECB 模式。但是,我仍然无法加密并向 Java 应用程序发送新消息。调查仍在继续。
一切正常。感谢您的多次提示。我可以确认 Java 默认使用 ECB
。所有填充字节都设置为添加的字节数(称为 PKCS5 填充)。 “Hello World”
-> 由 Java 加密 -> 使用 OpenSSL 解密将类似于 “Hello World\5\5\5\5\5”
。
关于java - 如何使用OpenSSL解密Java AES加密数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5136279/