我正在连接使用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的用途。
答案 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库。为我工作