堆栈周围变量已损坏

Stack around variable was corrupted

本文关键字:已损坏 变量 周围 堆栈      更新时间:2023-10-16

我有以下程序,在该程序中,我使用密钥长度为256位的AES_CBC对给定文本进行加密和解密。我想知道为什么当plaintextciphertextchecktext不是全局变量并且在它们是全局变量时工作正常时,我会在标题中出现错误。非常感谢。

#include <stdio.h>
#include <opensslaes.h>
#include <opensslrand.h>
#include <conio.h>
#include <openssldes.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();
}

全局和静态变量使用零初始化,而局部变量不使用。因此,当您在本地定义明文密文校验文本时,请使用memset将它们初始化为零。您的字符串应该以null结尾,但在您的情况下不是。密文校验文本不是空终止的。而明文由于strcpy调用而变为null终止。