使用OpenSSL中的AES CBC 我编写C++服务器函数,将加密的字符串传递到AES CBC 128位,称为java进程。我不能改变这个C++函数的新奇值。 为此,我在C++代码中使用OpenSSL AsAsStEyScript解密密钥()和AsHysCBCySuffice()方法。 但是在AES_cbc_encrypt()的签名中有一个长度参数,我相信它是实际字符串(未加密)的长度。但是,我的C++代码不知道实际长度。我是不是走错路了?有人能帮忙吗

使用OpenSSL中的AES CBC 我编写C++服务器函数,将加密的字符串传递到AES CBC 128位,称为java进程。我不能改变这个C++函数的新奇值。 为此,我在C++代码中使用OpenSSL AsAsStEyScript解密密钥()和AsHysCBCySuffice()方法。 但是在AES_cbc_encrypt()的签名中有一个长度参数,我相信它是实际字符串(未加密)的长度。但是,我的C++代码不知道实际长度。我是不是走错路了?有人能帮忙吗,openssl,Openssl,示例代码如下所示: unsigned char* decrypt(unsigned char* l_cInput_ptr) { unsigned char key[] = "asdfghjklpoiuytr"; unsigned char iv[] = "asdfghjklpoiuytr"; unsigned char * dec_out = (unsigned char *)malloc(80*sizeof(char)); memset(dec_out, 0, 80); AES_KEY d

示例代码如下所示:

unsigned char* decrypt(unsigned char* l_cInput_ptr)
{
unsigned char key[] = "asdfghjklpoiuytr";
unsigned char iv[] = "asdfghjklpoiuytr";

unsigned char * dec_out = (unsigned char *)malloc(80*sizeof(char));
memset(dec_out, 0, 80);

AES_KEY dec_key;

AES_set_decrypt_key(key,128,&dec_key);
AES_cbc_encrypt(l_cInput_ptr, dec_out, 16, &dec_key, iv, AES_DECRYPT);

....
}
l_cInput_ptr是加密字符串。decrypt()方法不知道实际字符串的长度。在这个例子中,我刚刚使用了一个伪值16。我无法更改java代码。

AES\u cbc\u encrypt()
length参数是输入的长度。因此,对于解密,这是加密数据的长度,对于CBC模式下的AES,它将始终是16字节的倍数(顺便说一句,您的代码不清楚如何获得
unsigned char*
所指的提供数据的长度)


解密后的数据将具有相同的长度并将被填充(通常是PKCS#7填充,有时只是添加空值,但实际上可能是任何内容)。解密后必须删除此填充才能获得原始明文。

是的,Andrey是对的,我遇到了同样的问题。如果原始未加密文本长度不是16字节的倍数,则解密后的数据与原始数据的长度相同,无需填充。如果原始未加密文本长度是16字节(n)的倍数,则解密长度为n+1,填充16字节,我们需要将其删除。代码如下:

AES_cbc_encrypt(&encrypted, &decrypted, length, &key2, iv2, 0);

length = strlen(decrypted);
if (length > AES_BLOCK_SIZE && (length % AES_BLOCK_SIZE == 0))
{
    length = length - AES_BLOCK_SIZE;
    memset(decrypted + length, 0, AES_BLOCK_SIZE);
}
printf("xxx %s", decrypted);
和。如果您不确定,请使用经过身份验证的加密。的可能副本