c和java中的输出AES/ECB/PKCS7不同

c和java中的输出AES/ECB/PKCS7不同,c,encryption,openssl,aes,pkcs#7,C,Encryption,Openssl,Aes,Pkcs#7,您好,我使用AES/ECB/PKCS7模式进行加密,分别使用c和java,加密和解密工作正常。但在c中,加密数据与java中的加密数据不同 我正在用C语言和java发布我的代码。我需要c语言的加密和java语言的解密。请帮助我aes/ecb/pkcs7的c代码是否正确??。。我正在使用openssl C代码: int Secure\u encrypt(无符号字符*in,int inlen,无符号字符*out,int*outlen) { int tmplen; //密钥是256,并且是固定的。 无

您好,我使用AES/ECB/PKCS7模式进行加密,分别使用c和java,加密和解密工作正常。但在c中,加密数据与java中的加密数据不同

我正在用C语言和java发布我的代码。我需要c语言的加密和java语言的解密。请帮助我aes/ecb/pkcs7的c代码是否正确??。。我正在使用openssl

C代码:

int Secure\u encrypt(无符号字符*in,int inlen,无符号字符*out,int*outlen)
{
int tmplen;
//密钥是256,并且是固定的。
无符号字符键[256]=
{0x21,0x0a,0x03,0x23,0x45,0x29,0x78,0x12,0x35,0x45,0x67,0x78,0x21,0x13,
0x34,0x56,0x67,0x45,0x12,0x89,0x38,0x0e,0xa0,0x15,0x21,
0x0a、0x03、0x23、0x45、0x0b、0x15、0x0c
};
无符号字符*iv=0;
执行副总裁;
EVP_CIPHER_CTX_init(&x);
EVP_CIPHER_CTX_set_padding(&x,1);//1-padding,0-无padding
if(!EVP_EncryptInit_ex(&x,EVP_aes_256_ecb(),0,key,iv))
{
//printf(“\n错误!!\n”);
返回-1;
}
如果(!EVP_EncryptUpdate(&x,out,outlen,(const unsigned char*)in,inlen))
{
//printf(“\n错误!!\n”);
返回-2;
}
如果(!EVP_EncryptFinal_ex(&x,out+*outlen,&tmplen)){
//printf(“\n错误!!\n”);
返回-3;
}
*outlen+=tmplen;
#ifdef调试
printf(“AES加密数据%d len\n”,*outlen);
打印数据(输出,*outlen);
#恩迪夫
EVP_密码_CTX_清理(&x);
返回0;
}
/*AES解密*/
AES解密
int Secure_decrypt(无符号字符*in,int inlen,无符号字符*out,int*outlen)
{
int tmplen;
无符号字符*iv=0;
无符号字符键[256]
//AES/ECB/PKCS7填充
执行副总裁;
EVP_CIPHER_CTX_init(&x);
EVP_CIPHER_CTX_set_padding(&x,1);//1-padding,0-无padding
if(!EVP_DecryptInit_ex(&x,EVP_aes_256_ecb(),0,key,iv)){
//printf(“\n错误!!\n”);
返回-1;
}
如果(!EVP_DecryptUpdate(&x,out,outlen,(const unsigned char*)in,inlen))
{
//printf(“\n错误!!\n”);
返回-2;
}
如果(!EVP_decryptedfinal_ex(&x,out+*outlen,&tmplen)){
//printf(“\n错误!!\n”);
返回-3;
}
*outlen+=tmplen;
#ifdef调试
printf(“AES加密数据%d len\n”,*outlen);
打印数据(输出,*outlen);
#恩迪夫
EVP_密码_CTX_清理(&x);
返回0;
}
Java代码:

导入java.security.security;
导入javax.crypto.Cipher;
导入javax.crypto.spec.SecretKeySpec;
导入org.apache.commons.codec.binary.Base64;
导入org.bouncycastle.jce.provider.BouncyCastleProvider;
公共阶级做这件事{
公共静态void main(字符串[]args){
addProvider(新的BouncyCastleProvider());
字符串strDataToEncrypt=“测试加密”;
byte[]byteDataToTransmit=strDataToEncrypt.getBytes();
//41 6E 6B 61 72 61 6F 20 49 74 61 64 69
//字节[]byteDataToTransmit=新字节[]
{
0x41,0x6E,0x6B,0x61,0x72,0x61,0x6F,0x20,0x49,0x74,0x74,0x61,0x64,0x69
};
试一试{
byte[]keyBytes=新字节[]{0x21,0x0a,0x03,0x23,0x45,0x29,0x78,0x12,0x35,
0x45,0x67,0x78,0x21,0x13,0x34,
0x56,0x67,0x45,0x12,0x9,0x38,0x0e,0x20,
0x15,0x21,0x0a、0x03,0x23,0x45,0x0b、0x15,0x0c
};
byte[]encrypted=aesEncrypt(byteDataToTransmit,keyBytes);
System.out.println(“\n AES加密数据为”+新字符串(加密));
byte[]BytedCrypt=AESEDecrypt(bytestrEncrypt,keyBytes);
System.out.println(“\n AES解密数据为”+字节加密);
//byte[]BytedCrypt=AES解密(加密,密钥字节);
//System.out.println(“\n AES解密数据为”+新字符串(byteDecrypt));
}
捕获(异常扩展)
{
System.out.println(“异常捕获”+exp);
exp.printStackTrace();
}
}
公共静态字节[]加密(字节[]原始,字节[]密钥)
{
尝试
{
SecretKeySpec keySpec=null;
密码=空;
{
keySpec=新的SecretKeySpec(键,“AES/ECB/PKCS7Padding”);
cipher=cipher.getInstance(“AES/ECB/PKCS7Padding”);
cipher.init(cipher.ENCRYPT_模式,keySpec);//加密
}
返回密码.doFinal(原件);
}
捕获(例外e)
{
//Logger.e(e.toString());
}
返回null;
}
公共静态字节[]AES解密(字节[]加密,字节[]密钥)
{
尝试
{
SecretKeySpec keySpec=null;
密码=空;
{
keySpec=新的SecretKeySpec(键,“AES/ECB/PKCS7Padding”);
cipher=cipher.getInstance(“AES/ECB/PKCS7Padding”);
cipher.init(cipher.DECRYPT_模式,keySpec);
}
System.out.println(“In Decryprion\n”+新字符串(加密));
返回cipher.doFinal(加密);
}
捕获(例外e)
{
//Logger.e(e.toString());
}
返回null;
}
}

至少您已经关闭了对返回数据量的处理。检查你的缓冲区处理!此外,在Java中,您使用
新字符串(加密)
而不是将字节数组转换为十六进制。

您确定输出不相同吗?在不指定文本编码的情况下使用新的String(加密)和String.getBytes()方法可能会产生不可预测的结果,因此最好在打印之前将字节[]转换为十六进制或Base64。请自行格式化代码。我在您的代码中使用了
astyle
。您确定keyspec部分使用“AES/ECB/PKCS7Padding”编译吗?您不应该需要BouncyCas