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

发布于 2024-10-19 06:02:58 字数 436 浏览 2 评论 0原文

我正在连接到一个旧版 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

伴梦长久 2024-10-26 06:02:58

找到可能的答案:

“默认情况下,Java 密码(至少在 Sun 的实现中)是按照以下方式构建的:
称为电子密码本(ECB)模式。”
(来源:http://www.javamex.com/tutorials/cryptography/block_modes.shtml< /a>)


因此,如果默认情况下使用 ECB,我想这意味着没有初始化向量,并且我可以使用 OpenSSL 中的以下方法:

void AES_ecb_encrypt(*in, *out, *key, enc);

使用 AES_decrypt() 我可以解密源自的 1000 多个字节消息在Java方面。所以看起来 Java 确实默认为没有初始化向量的 ECB 模式。但是,我仍然无法加密并向 Java 应用程序发送新消息。调查仍在继续。


一切顺利。感谢您的多次提示。我可以确认 Java 默认使用 ECB。所有填充字节都设置为添加的字节数(称为 PKCS5 填充)。 “你好世界” -> Java加密->使用 OpenSSL 解密的内容将类似于 “Hello World\5\5\5\5\5”

Possible answer found:

"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)

So if ECB is used by default, I guess that means no initialization vector, and I can use the following method from OpenSSL:

void AES_ecb_encrypt(*in, *out, *key, enc);

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".

万劫不复 2024-10-26 06:02:58

一些密码算法需要额外的初始化参数;这些可以作为 java.security.AlgorithmParameters 对象或 java.security.spec.AlgorithmParameterSpec 对象传递给 init() 。加密时,您可以省略这些参数,Cipher 实现将使用默认值或为您生成适当的随机参数。此时,需要在加密后调用 getParameters() 来获取用于加密的 AlgorithmParameters。这些参数是解密所必需的,因此必须与加密数据一起保存或传输。

http://docstore.mik.ua/orelly/java-ent/jnut /ch26_01.htm

您可以修改Java代码来获取这些参数吗?

Some cryptographic algorithms require additional initialization parameters; these can be passed to init() as a java.security.AlgorithmParameters object or as a java.security.spec.AlgorithmParameterSpec object. When encrypting, you can omit these parameters, and the Cipher implementation uses default values or generates appropriate random parameters for you. In this case, you should call getParameters() after performing encryption to obtain the AlgorithmParameters used to encrypt. These parameters are required in order to decrypt, and must therefore be saved or transferred along with the encrypted data.

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?

五里雾 2024-10-26 06:02:58

在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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文