c++ - OpenSSL AES 加密错误

标签 c++ encryption openssl

我在下面有一些代码。我的问题是加密和解密的字符数组有一个奇怪的结尾。

#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/

相关文章:

c++ - 在哪里可以放置我的 MFC 控件初始化代码

php - 使用 openssl_private_decrypt 解密将不起作用,因为文本正在存储撇号

java - 在 Windows 上的 tomcat 8.5 中安装 pfx SSL 证书

c++ - 单独文件中命名空间中的函数模板可以正常编译,但链接器找不到它

c++ - 如何在 openmp 中并行执行 while 和 while 循环?

algorithm - 为什么无法手动测试 AES 算法?

sql-server - SQL Server 2005 数据库加密 - 主 key 未保持打开状态

ios - 在 iOS 中使用公钥验证数字签名

c - 使用 openssl 库验证自签名/过期证书不会返回错误

c++ - 数组内存地址总是按从小到大的顺序排列吗?