【发布时间】:2014-09-11 18:14:31
【问题描述】:
我有以下程序,其中我使用密钥长度为 256 位的 AES_CBC 加密和解密给定文本。我想知道为什么当plaintext、ciphertext 和checktext 不是全局变量并且它们是全局变量时我会在标题中出现错误。谢谢!
#include <stdio.h>
#include <openssl\aes.h>
#include <openssl\rand.h>
#include <conio.h>
#include <openssl\des.h>
#define BIG_TEST_SIZE 1024
char plaintext[BIG_TEST_SIZE];
char ciphertext[BIG_TEST_SIZE];
char checktext[BIG_TEST_SIZE];
AES_KEY key;
char rkey[32+1];
static void hexdump(FILE *f,const char *title,const unsigned char *s,int l)
{
int n=0;
fprintf(f,"%s",title);
for( ; n < l ; ++n)
{
if((n%16) == 0)
fprintf(f,"\n%04x",n);
fprintf(f," %02x",s[n]);
}
fprintf(f,"\n");
}
int main(int argc, char* argv[])
{
//char plaintext[BIG_TEST_SIZE];
//char ciphertext[BIG_TEST_SIZE];
//char checktext[BIG_TEST_SIZE];
char saved_iv[32+1];
int err = 0;
RAND_pseudo_bytes((unsigned char*)rkey, sizeof rkey);
unsigned char iv[32+1]="01234567890123456789012345678901";
memcpy(saved_iv, iv, sizeof saved_iv);
strcpy((char*)plaintext,"aaa");
const size_t encslength = ((strlen(plaintext) + AES_BLOCK_SIZE) / AES_BLOCK_SIZE) * AES_BLOCK_SIZE;
// Straight encrypt
AES_set_encrypt_key((unsigned char*)rkey, 256, &key);
hexdump(stdout, "plaintext", (unsigned char*)plaintext, strlen(plaintext));
AES_cbc_encrypt((unsigned char*)plaintext, (unsigned char*)ciphertext, encslength, &key, (unsigned char*)iv,AES_ENCRYPT);
hexdump(stdout, "ciphertext", (unsigned char*)ciphertext, strlen(plaintext));
// Straight decrypt
AES_set_decrypt_key((unsigned char*)rkey, 256, &key);
memcpy(iv, saved_iv, sizeof iv);
AES_cbc_encrypt((unsigned char*)ciphertext, (unsigned char*)checktext, encslength, &key, (unsigned char*)iv,AES_DECRYPT);
hexdump(stdout, "checktext", (unsigned char*)checktext, strlen(plaintext));
getch();
}
【问题讨论】:
-
因为它们在
main中声明时是在堆栈上分配的。您可以使用诸如 valgrind 之类的工具来查找无效的写入和读取。 -
plaintext[] 是一个数组,所以 strcpy( plaintext, "aaa");是正确的。实际使用的代码将明文的第一个(指针大小)字节视为指向“aaa”存储位置的指针。除了这个错误,代码中还有其他类似的错误。
标签: c++ c openssl aes stack-corruption