java - 如何使用OpenSSL解密Java AES加密数据?

标签 java c openssl aes encryption

我正在连接到一个旧版 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/

相关文章:

java - 如何将 DynamoDB 扫描结果添加到对象列表?

c - 如何检查 UTF-8 字符串是否以 'a' 开头

java - Tomcat JDBCRealm 身份验证在部署后不起作用

java - 使用 Linkify 和正则表达式用 @ 提及用户

c - 如何用确定的值初始化数组?

c - 二叉树层次顺序使用队列遍历?

nginx - 在重启期间将证书密码传递给带有 https 站点的 Nginx

ssl - 如何在终端中使用 OpenSSL 将 .pem 文件转换为其他格式?

Python 请求 SSL 错误 : hostname doesn't mactch either of

java - 我在面板上有一个用于按钮的 actionListener,获取空指针