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

问题描述:

我接口到传统的Java应用程序(该应用不能被改变),这是使用AES加密数据。这里是原始的Java代码如何实例进行AES加密:如何使用OpenSSL解密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是做什么的。

+0

这很好地说明了为什么一个不应该使用默认值,但始终明确指示操作和填充模式的模式。 – 2011-10-17 20:43:19

可能的答案中发现:

“默认情况下,Java的加密算法(至少在Sun的实现)在什么是所谓的 电子密码本(ECB)模式构建。” (来源:http://www.javamex.com/tutorials/cryptography/block_modes.shtml

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

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

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


明白了一切工作。感谢无数的提示。我可以确认Java默认使用ECB。所有填充字节都设置为所添加的字节数(称为PKCS5填充)。 "Hello World"→通过Java加密→使用OpenSSL解密将看起来像"Hello World\5\5\5\5\5"

+0

知道了所有的工作。感谢无数的提示。我可以确认Java默认使用ECB。所有填充字节都设置为添加的字节数。 “Hello World” - > Java加密 - >使用OpenSSL解密将看起来像“Hello World \ 5 \ 5 \ 5 \ 5 \ 5”。 – 2011-03-01 18:54:58

+0

这种填充模式被称为PKCS#5-Padding,OpenSSL也应该有一种方法来指示这种填充模式。 (我编辑了你的帖子以添加你评论中的信息,所以答案已完成,请随时恢复或编辑。) – 2011-10-17 20:46:21

+0

你找到了一种方法来表示填充吗? http://stackoverflow.com/q/19810373/655703 – Ne0 2013-11-06 11:16:42

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

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

您是否能够修改Java代码来获得阿霍德这些参数?

使用Bountry城堡图书馆在Java中。它支持相当于java中的openssl库的c/C++。工作对我来说