如何使用OpenSSL解密Java AES加密数据?
我正在连接到一个旧版 Java 应用程序(该应用程序无法更改),该应用程序使用 AES 加密数据。以下是原始 Java 代码实例化 AES 密码的方式:
SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec );
我是一名 C/C++ 开发人员,而不是 Java 开发人员,但据我所知,这段遗留 Java 代码没有指定模式,也没有指定初始化向量。有人知道 Java 默认使用什么,因为它没有指定吗?
我们需要新的 C/C++ 应用程序来解密 Java 加密的数据。但我不知道如何使用 OpenSSL 的初始化向量和链接模式,因为我不知道 java 是做什么的。
I'm interfacing to a legacy Java application (the app cannot be changed) which is encrypting data using AES. Here is how the original Java code is instantiating the AES cipher:
SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec );
I'm a C/C++ developer, not Java, but from what I can tell this legacy Java code is not specifying the mode, nor the initialization vector. Anyone happen to know what Java would be using by default since it isn't specified?
We need the new C/C++ app to decrypt the Java-encrypted data. But I'm at a loss as to what to use for OpenSSL's initialization vector and chaining mode since I don't know what java does.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
找到可能的答案:
因此,如果默认情况下使用 ECB,我想这意味着没有初始化向量,并且我可以使用 OpenSSL 中的以下方法:
使用
AES_decrypt()
我可以解密源自的 1000 多个字节消息在Java方面。所以看起来 Java 确实默认为没有初始化向量的 ECB 模式。但是,我仍然无法加密并向 Java 应用程序发送新消息。调查仍在继续。一切顺利。感谢您的多次提示。我可以确认 Java 默认使用
ECB
。所有填充字节都设置为添加的字节数(称为 PKCS5 填充)。“你好世界”
-> Java加密->使用 OpenSSL 解密的内容将类似于“Hello World\5\5\5\5\5”
。Possible answer found:
So if ECB is used by default, I guess that means no initialization vector, and I can use the following method from OpenSSL:
Using
AES_decrypt()
I can decrypt 1000+ byte messages that originated on the Java side. So it looks like Java does indeed default to ECB mode with no initialization vector. However, I still cannot encrypt and send a new message to the Java app. Investigation continues.Got it all working. Thanks for the numerous hints. I can confirm Java uses
ECB
by default. All padding bytes are set to the number of bytes added (which is known as PKCS5-padding)."Hello World"
-> encrypted by Java -> decrypted using OpenSSL will look like"Hello World\5\5\5\5\5"
.http://docstore.mik.ua/orelly/java-ent/jnut /ch26_01.htm
您可以修改Java代码来获取这些参数吗?
http://docstore.mik.ua/orelly/java-ent/jnut/ch26_01.htm
Are you able to modify the Java code to get ahold of these parameters?
在java中使用Bountry城堡库。它支持相当于java中openssl库的c/c++。为我工作
Use Bountry castle library in java . it supports c/c++ equivalent to openssl library in java . worked for me