使用OpenSSL进行AES_128_CBC加密/解密

时间:2020-02-13 02:25:48

标签: c openssl aes

我目前正在尝试开发一个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;

}

1 个答案:

答案 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值时停止。

相关问题