繁体   English   中英

AES_128_CBC 使用 OpenSSL 加密/解密

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM