我目前正在尝试开发一个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;
}
答案 0 :(得分:4)
您忽略了代码中的一些内容。
首先,您声明了aes_input
数组而未对其进行初始化:
/* Input data to encrypt */
unsigned char aes_input[BUFSIZE];
由于尚未初始化此数组,因此此数组可能包含任何值。不同的编译器在这里将做不同的事情。将整个数组初始化为可预测值的一种方法是用零填充,如下所示:
unsigned char aes_input[BUFSIZE] = {0};
此后,无论运行多少次,输出都应该是可预测的。
整个数组的内容是相关的,因为您正在调用OpenSSL来加密整个数组,因为您在调用sizeof(aes_input)
函数时将AES_cbc_encrypt()
作为要加密的纯文本的大小进行传递:
AES_cbc_encrypt(aes_input, enc_out, sizeof(aes_input), &enc_key, iv, AES_ENCRYPT);
由于您的输入大部分未初始化(前八个字节(包含字符串“ Testing”)除外),因此无法预测此函数的输出。
现在,按如下所示打印输出时:
while (*e) printf(" [%02x]", *e++);
您只会看到直到第一个字节为止的字节,其值为0
。这是一个错误,因为密文可以轻松(并且确实)包含值为0
的字节。您将密文当作是一个以零结尾的字符串,而不是。您应该循环遍历密文中的所有字节,而不是遇到0
值时停止。