Стек вокруг переменной поврежден

0

У меня есть следующая программа, в которой я шифрую и расшифровываю данный текст с использованием AES_CBC с длиной ключа в 256 бит. Я хотел бы знать, почему я получаю ошибку в заголовке, когда 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();
}
  • 0
    Потому что они размещаются в стеке, когда они объявлены в main . Вы можете использовать инструмент, такой как valgrind, чтобы найти недопустимые записи и чтения.
  • 0
    Открытый текст [] - это массив, поэтому strcpy (обычный текст, "aaa"); правильно. Фактически используемый код обрабатывает первые (размер указателя) байты открытого текста как указатель на место, где должен храниться «aaa». Помимо этой ошибки, в коде есть и другие подобные ошибки.
Теги:
aes
openssl

1 ответ

1
Лучший ответ

Глобальная и статическая переменная инициализируются нулем, а локальные переменные - нет. Поэтому, когда вы определяете открытый текст, зашифрованный текст и контрольный текст, локально используйте memset для инициализации их нулем. Ваша строка должна быть нулевой, но в вашем случае это не так. зашифрованный текст, checktext не завершается нулем. в то время как открытый текст становится нулевым, из-за вызова strcpy.

  • 2
    Я не думаю, что это правильно. strcpy : «Копирует строку C, на которую указывает источник, в массив, на который указывает пункт назначения, включая завершающий нулевой символ (и останавливается в этой точке).» Пример на cplusplus.com/reference/cstring/strcpy делает то же самое (строка 11).
  • 0
    Я. вы правы, strcpy также копирует нулевой символ ..
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню