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

时间:2011-02-27 21:56:20

标签: java c openssl aes encryption

我正在连接使用AES加密数据的旧Java应用程序(应用程序无法更改)。以下是原始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的用途。

3 个答案:

答案 0 :(得分:3)

找到可能的答案:

  

“默认情况下,Java Ciphers(至少在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"

答案 1 :(得分:1)

  

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

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

您是否可以修改Java代码以获取这些参数?

答案 2 :(得分:0)

在java中使用Bountry城堡库。它支持c / c ++,相当于java中的openssl库。为我工作