Java 使用C+在Android(客户端)上进行Aes加密,在服务器上进行解密+;

Java 使用C+在Android(客户端)上进行Aes加密,在服务器上进行解密+;,java,c++,openssl,aes,Java,C++,Openssl,Aes,我正在android应用程序上使用AES加密,我遇到了一个问题。我希望我的应用程序使用Aes_256_Cbc算法加密密码。加密字符串每次都必须不同,这就是为什么每次我都需要一个真正的随机iv。我必须加密这个单词的代码是: 导入android.content.Context; 导入java.security.SecureRandom; 导入javax.crypto.Cipher; 导入javax.crypto.spec.IvParameterSpec; 导入javax.crypto.spec.Se

我正在android应用程序上使用AES加密,我遇到了一个问题。我希望我的应用程序使用Aes_256_Cbc算法加密密码。加密字符串每次都必须不同,这就是为什么每次我都需要一个真正的随机iv。我必须加密这个单词的代码是:

导入android.content.Context;
导入java.security.SecureRandom;
导入javax.crypto.Cipher;
导入javax.crypto.spec.IvParameterSpec;
导入javax.crypto.spec.SecretKeySpec;
公共类加密机
{
语境;
私有静态最终字符串WORD=“aefbjolpigrschnx”;
私有静态最终字符串KEY=“kumyntbrvecwxasqertyplmqazwsxedc”;
私有最终静态字符串HEX=“0123456789ABCDEF”;
公共加密程序(上下文c)
{
上下文=c;
}
公共字符串getEncryptedPasswd()
{
字符串ivHex=“”;
字符串encryptedHex=“”;
尝试
{
SecureRandom=SecureRandom.getInstance(“SHA1PRNG”);
字节[]iv=新字节[16];
随机。下一字节(iv);
ivHex=toHex(iv);
IvParameterSpec ivspec=新的IvParameterSpec(iv);
SecretKeySpec skeySpec=新的SecretKeySpec(KEY.getBytes(“UTF-8”),“AES”);
Cipher encryptionCipher=Cipher.getInstance(“AES/CBC”);
encryptionCipher.init(Cipher.ENCRYPT_模式,skeySpec,ivspec);
byte[]encryptedText=encryptionCipher.doFinal(WORD.getBytes(“UTF-8”);
encryptedHex=toHex(encryptedText);
} 
捕获(例外e)
{
}
返回ivHex+加密HEX;
}
公共静态字符串toHex(字节[]buf)
{
如果(buf==null)
{
返回“”;
}       
StringBuffer结果=新的StringBuffer(2*buf.长度);
对于(int i=0;i>4)和0x0f)).append(十六进制字符(buf[i]&0x0f));
}
返回result.toString();
}
我的应用程序调用函数
getEncryptedPasswd()几次,每次都给出一个不同的十六进制输出,如预期的那样,然后将加密的密码发送到我的代码必须在C++中的服务器。但是当我尝试用OpenSSL对密码进行解密时,我不需要正确的输出。有人能帮助我吗?我在服务器上的代码是:

#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#定义键“kumyntbrvecwxasqertyplmqazwsxedc”
使用名称空间std;
无符号整数hex2bin(字符*ibuf,无符号字符*obuf,无符号整数ilen)
{
无符号整数i;
无符号整数j;
无符号整数乘以=0;
无符号字符ch;
//处理字符列表
对于(i=0;i如果(CH=‘0’& & CH<P>我是C++的人,不是java,所以我不能评论你的这行,也不是说它看起来会做你需要的:

Cipher encryptionCipher = Cipher.getInstance("AES/CBC");

但是,如果有更多的信息,请注意,我可以确认java默认使用ECB模式。像你自己一样,我也必须在C++中解密一些已经用java加密的文本。我花了一段时间来了解发生了什么:

可能有一个不同的地方可能是填充。你没有在java代码中选择填充选项。我是N。当然,如果它默认为“代码> NopAudio/Cuth>或 PKCS5PADIO/C++ >。C++代码使用其他东西是否合理?你的输出完全不正确,或者它只是包含意外字符?还有,你完成了一个测试,以确保java和C++的十六进制编码/解码方法兼容吗?如果你在一个错误中出错了。F实现时,你可能在错误数据上操作。谢谢你的回答。这完全是错误的。我怀疑C++代码有问题,而不是Android(java)。在C++中有一个标准的AES实现,如何解密java(Android)中加密的十六进制字符串。