作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在尝试开发一个 C 程序来使用 OpenSSL 库实现 AES_128_CBC。当我第一次编译和运行程序时,我得到了密文 block ,然后我的明文显示正在解密。这似乎运行得很顺利。我的问题是当我再次编译并运行时。我的密文 block 增加了(大小增加了大约 3 倍),但我的解密保持不变。我希望如果我使用相同的 key 和 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 加密整个数组,因为您在调用 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
值时停止。
关于c - AES_128_CBC 使用 OpenSSL 加密/解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60199611/
我是一名优秀的程序员,十分优秀!