就在做aes加解密的时候,密钥的长度还必须是32位长度的看看下面的代码:
int Test(char *in_data, char *out_data, char *aes_decrypt_key, int encrypt_chunk_size = 16)
{
if (strlen((char *)aes_decrypt_key) == 0)
{
return 1;
}
unsigned char aes_keybuf[32];
memset(aes_keybuf, 0, sizeof(aes_keybuf));
strcpy((char *)aes_keybuf, aes_decrypt_key);
AES_KEY aeskey;
AES_set_decrypt_key(aes_keybuf, 256, &aeskey);
// unsigned char *aes_keybuf = new unsigned char[strlen(aes_decrypt_key)];
// memset(aes_keybuf, 0, strlen(aes_decrypt_key));
// strcpy((char *)aes_keybuf, aes_decrypt_key);
// AES_KEY aeskey;
// AES_set_decrypt_key(aes_keybuf, 256, &aeskey);
AES_decrypt((unsigned char *)in_data, (unsigned char *)out_data, &aeskey);
return 0;
}
在测试的时候,把注释那段打开,你会发现,这是解密不成功的,因为密钥这里才9位+'\0'。所以数据会不对。
即使你在加密部分也是使用非32的密钥,也会导致解密出现问题。所以这里应该是定死32位的一个数据长度,所以最终的字节加解密应该是这样的(当然我这里没做数组的越界处理,如果正式应用应该进行截断的):
// 对所输入的in_data字节大小进行aes加密,不做ou_data的长度检测,确保调用的时候长度合理
int AesEncryptBytes(const unsigned char* in_data, unsigned char* out_data,
const char* aes_encrypt_key, int in_data_chunk_size = 16)
{
if (strlen((char *)aes_encrypt_key) == 0)
{
return 1;
}
unsigned char aes_keybuf[32];
memset(aes_keybuf, 0, sizeof(aes_keybuf));
strcpy((char *)aes_keybuf, aes_encrypt_key);
AES_KEY aeskey;
AES_set_encrypt_key(aes_keybuf, 256, &aeskey);
AES_encrypt(in_data, out_data, &aeskey);
return 0;
}
// 对所输入的in_data字节大小进行aes解密,不做ou_data的长度检测,确保调用的时候长度合理
int AesDecryptBytes(const unsigned char* in_data, unsigned char* out_data,
const char* aes_decrypt_key, int in_data_chunk_size = 16)
{
if (strlen((char *)aes_decrypt_key) == 0)
{
return 1;
}
unsigned char aes_keybuf[32];
memset(aes_keybuf, 0, sizeof(aes_keybuf));
strcpy((char *)aes_keybuf, aes_decrypt_key);
AES_KEY aeskey;
AES_set_decrypt_key(aes_keybuf, 256, &aeskey);
AES_decrypt(in_data, out_data, &aeskey);
return 0;
}