我在下面有一些代码。我的问题是加密和解密的字符数组有一个奇怪的结尾。
#include <iostream>
#include <openssl\evp.h>
#define AES_BLOCK_SIZE 16
static EVP_CIPHER_CTX Encrypt_Context, Decrypt_Context;
int aes_init(unsigned char *key_data, int key_data_len, unsigned char *salt, EVP_CIPHER_CTX *e_ctx,
EVP_CIPHER_CTX *d_ctx)
{
int i, nrounds = 1;
unsigned char key[16], iv[16];
i = EVP_BytesToKey(EVP_aes_128_cbc(), EVP_sha1(), salt, key_data, key_data_len, nrounds, key, iv);
if (i != 16) {
printf("Key size is %d bits - should be 128 bits\n", i);
return -1;
}
EVP_CIPHER_CTX_init(e_ctx);
EVP_EncryptInit_ex(e_ctx, EVP_aes_128_cbc(), NULL, key, iv);
EVP_CIPHER_CTX_init(d_ctx);
EVP_DecryptInit_ex(d_ctx, EVP_aes_128_cbc(), NULL, key, iv);
return 0;
}
unsigned char *aes_encrypt(EVP_CIPHER_CTX *e, unsigned char *plaintext, int *len)
{
int c_len = *len + AES_BLOCK_SIZE, f_len = 0;
unsigned char *ciphertext = (unsigned char *)malloc(c_len);
EVP_EncryptInit_ex(e, NULL, NULL, NULL, NULL);
EVP_EncryptUpdate(e, ciphertext, &c_len, plaintext, *len);
EVP_EncryptFinal_ex(e, ciphertext+c_len, &f_len);
*len = c_len + f_len;
return ciphertext;
}
unsigned char *aes_decrypt(EVP_CIPHER_CTX *e, unsigned char *ciphertext, int *len)
{
int p_len = *len, f_len = 0;
unsigned char *plaintext = (unsigned char*)malloc(p_len);
EVP_DecryptInit_ex(e, NULL, NULL, NULL, NULL);
EVP_DecryptUpdate(e, plaintext, &p_len, ciphertext, *len);
EVP_DecryptFinal_ex(e, plaintext+p_len, &f_len);
*len = p_len + f_len;
return plaintext;
}
void main()
{
unsigned char * data_to_encrypt = (unsigned char*)"aaaaaaaaabbbbbbbbbbbbbbccccccccc";
unsigned char *key_data = (unsigned char *)"aaaaaaaaaaaaaaaa";
int key_data_len = strlen((const char*) key_data);
char * ciphertext;
char * plaintext;
aes_init(key_data, 16, NULL, &Encrypt_Context, &Decrypt_Context);
int length = strlen((const char*) data_to_encrypt)-1;
printf("Clear text :%s\n", data_to_encrypt);
ciphertext = (char *)aes_encrypt(&Encrypt_Context, data_to_encrypt, &length);
printf("Crypted text :%s\n", ciphertext);
plaintext = (char *)aes_decrypt(&Decrypt_Context, (unsigned char*)ciphertext, &length);
printf("Decrypted text :%s\n", plaintext);
}
通过这段代码,我进入了控制台:
Clear text :aaaaaaaaabbbbbbbbbbbbbbccccccccc Crypted text :°ЁТ☼#єз▬├^^,♦Ёфм:ЇъШ╙y╒КzukЩu@8¤═══════════════¤¤¤¤ Decrypted text :aaaaaaaaabbbbbbbbbbbbbbcccccccc☺¤¤¤¤
什么是加密后的═══════════════¤¤¤¤和解密后的☺¤¤¤¤?我的代码有什么问题?
谢谢!
最佳答案
加密例程处理二进制数据,而不是 C 字符串,它们返回指针的数组不是空终止的,所以当使用 printf
打印时(它需要一个空终止的字符串) 你会得到恰好位于这些数组之后的随机垃圾。
要解决此问题,请确保空终止,使用类似 fwrite
的方法或遍历字符以打印数组。
关于c++ - OpenSSL AES 加密错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10656739/