如何使用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库。 为我工作
- Java AES:没有安装的提供程序支持此密钥:javax.crypto.spec.SecretKeySpec
- 加密在唯一文件中附加IVSBytes的文件 – 执行:给定最终块未正确填充
- 在Java中使用AES-128进行加密
- GSSexception:不支持/启用具有HMAC SHA1-96的加密类型AES256CTS模式
- Java Cipher – PBE线程安全问题
- 不同的输出加密CryptoJS和Java代码
- AES加密IV
- 想要使用带有32字节的AES 256 CBC,但它显示了java.security.InvalidAlgorithmParameterException
- 使用IGE解密Java AES-256