[英]AES_128_CBC Encryption/Decryption using OpenSSL
我目前正在尝试开发一个 C 程序来使用 OpenSSL 库实现 AES_128_CBC。 当我第一次编译和运行程序时,我得到了密文块,然后我的明文显示为被解密。 这似乎运行得很顺利。 我的问题是当我再次编译并运行时。 我的密文块增长了(大约增加了 3 倍),但我的解密保持不变。 我希望如果我使用相同的密钥和 IV,无论我编译和运行程序多少次,我的密文都将保持不变。 谁能看出为什么会发生这种情况?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/aes.h>
#define BUFSIZE 1024
/* AES key for Encryption and Decryption */
const static unsigned char aes_key[]= {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF};
unsigned char iv[] = {0x98,0x76,0x54,0x32,0x10,0xFE,0xDC,0xBA,0x98,0x76,0x54,0x32,0x10,0xFE,0xDC,0xBA};
/* Print Encrypted and Decrypted data packets */
void print_data(const char *tittle, const void* data, int len);
int main( )
{
/* Input data to encrypt */
unsigned char aes_input[BUFSIZE];
strcpy(aes_input, "Testing");
fprintf(stderr, "%s\n", aes_input);
/* Init vector */
memset(iv, 0x00, AES_BLOCK_SIZE);
/* Buffers for Encryption and Decryption */
unsigned char enc_out[sizeof(aes_input)];
unsigned char dec_out[sizeof(aes_input)];
unsigned char *e = enc_out;
/* AES-128 bit CBC Encryption */
AES_KEY enc_key, dec_key;
AES_set_encrypt_key(aes_key, sizeof(aes_key)*8, &enc_key);
AES_cbc_encrypt(aes_input, enc_out, sizeof(aes_input), &enc_key, iv, AES_ENCRYPT);
fprintf(stderr, "Encrypted:");
while (*e) printf(" [%02x]", *e++);
printf("\n");
/* AES-128 bit CBC Decryption */
memset(iv, 0x00, AES_BLOCK_SIZE); // don't forget to set iv vector again, else you can't decrypt data properly
AES_set_decrypt_key(aes_key, sizeof(aes_key)*8, &dec_key); // Size of key is in bits
AES_cbc_encrypt(enc_out, dec_out, sizeof(aes_input), &dec_key, iv, AES_DECRYPT);
fprintf(stderr, "The Plaintext After Decryption is: %s\n", dec_out);
return 0;
}
您忽略了代码中的一些内容。
首先,您已声明aes_input
数组而未对其进行初始化:
/* Input data to encrypt */
unsigned char aes_input[BUFSIZE];
由于您尚未初始化此数组,因此在此之后它可能包含任何值。 不同的编译器会在这里做不同的事情。 将整个数组初始化为可预测值的一种方法是用零填充它,如下所示:
unsigned char aes_input[BUFSIZE] = {0};
在此之后,无论您运行多少次,输出都应该是可预测的。
整个数组的内容是相关的,因为您要求 OpenSSL 加密整个数组,因为您在调用AES_cbc_encrypt()
函数时将sizeof(aes_input)
作为要加密的明文大小传递:
AES_cbc_encrypt(aes_input, enc_out, sizeof(aes_input), &enc_key, iv, AES_ENCRYPT);
由于您的输入大部分未初始化(前八个字节除外,其中包含字符串“Testing”),因此无法预测此函数的输出。
现在,当您按如下方式打印该输出时:
while (*e) printf(" [%02x]", *e++);
您只会看到直到第一个值为0
字节。 这是一个错误,因为密文很容易(并且确实)包含值为0
字节。 您将密文视为以零结尾的字符串,而事实并非如此。 不要在遇到0
值时停止,而是应该遍历密文中的所有字节。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.