就在做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; }