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

我正在连接使用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的用途。

找到可能的答案:

“默认情况下,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"

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

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

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

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