Как получить зашифрованный текст в результате шифрования, используя aes cb c 128 бит с открытым ssl на языке c - PullRequest
1 голос
/ 23 февраля 2020

Я работаю в лаборатории компьютерной безопасности. Цель лабораторной работы - найти ключ, используемый для шифрования простого текста, заданного начального вектора, открытого текста, зашифрованного текста и списка возможных ключей. В настоящее время я застрял, пытаясь получить сырой текст шифра из метода ниже. Это мой первый опыт работы с openssl.


void testKey(char * word){
        unsigned char key[128];
        char * out = malloc(1024);
        string2hexString(word, key);
        int successful_encrypt = encrypt(word,out);

        if (successful_encrypt){
            printf("Successful Encryption %02x, Word: %s, Key: %s \n\n", out, word,key);
        }}

int encrypt(char * key, char* out){
    unsigned char outbuf[1024];

    int outlen, tmplen;
    EVP_CIPHER_CTX ctx;
    char intext[] = "This is a seeed lab.";
    unsigned char iv[] = {'0xaa', '0xbb', '0xcc', '0xdd', '0xee', '0xff', '0x0', '0x99', '0x88', '0x77', '0x66', '0x55', '0x44', '0x33', '0x22', '0x11'};
    EVP_CIPHER_CTX_init(&ctx);
    EVP_EncryptInit_ex(&ctx, EVP_aes_128_cbc(), NULL, key, iv);

    if(!EVP_EncryptUpdate(&ctx, outbuf, &outlen, intext, strlen(intext)))
        {
            /* Error */
            return 0;
        }
    if(!EVP_EncryptFinal_ex(&ctx, outbuf + outlen, &tmplen))
        {
            /* Error */
            return 0;
        }
    printf("%s", intext);
    outlen += tmplen;
    printf("\n\n%x\n\n", outbuf);
    EVP_CIPHER_CTX_cleanup(&ctx);
    strcpy(out, outbuf);
    return 1;
}

По сути, я перебираю список ключей и хочу сравнить результат шифрования с зашифрованным текстом, который мне дали. Ниже приведен токовый выход. Строка после успешного шифрования - это результат шифрования , который, как я подозреваю, ошибочен или не соответствует тому, что я ищу, по крайней мере.


This is a seeed lab.

bfc95fdc

Successful Encryption a391ef0, Word: Zorn############, Key: 5A6F726E232323232323232323232323 

This is a seeed lab.

bfc95fdc

Successful Encryption a3922f8, Word: Zoroaster#######, Key: 5A6F726F617374657223232323232323 

This is a seeed lab.

bfc95fdc

Successful Encryption a392700, Word: Zoroastrian#####, Key: 5A6F726F6173747269616E2323232323 

This is a seeed lab.

bfc95fdc

Successful Encryption a392b08, Word: zounds##########, Key: 7A6F756E647323232323232323232323 

This is a seeed lab.

bfc95fdc

Successful Encryption a392f10, Word: z's#############, Key: 7A277323232323232323232323232323 

This is a seeed lab.

bfc95fdc

Successful Encryption a393318, Word: zucchini########, Key: 7A75636368696E692323232323232323 

This is a seeed lab.

bfc95fdc

Successful Encryption a393720, Word: Zurich##########, Key: 5A757269636823232323232323232323 

This is a seeed lab.

bfc95fdc

Successful Encryption a393b28, Word: zygote##########, Key: 7A79676F746523232323232323232323

Данный зашифрованный текст "8d20e5056a8d24d0462ce74e4904c1b513e10d1df4a2ef2ad4540fae1ca0aaf9" Так что я нужен вывод шифрования в каком-то формате, который имеет смысл сравнивать с этой строкой. Как я могу получить необработанный зашифрованный текст в openssl aes 128 cb c шифровании с использованием библиотеки c?

1 Ответ

0 голосов
/ 23 февраля 2020

Вы неправильно печатаете зашифрованный текст:

unsigned char outbuf[1024];
printf("\n\n%x\n\n", outbuf);

Ваш оператор print не обращается к элементам массива outbuf, а вместо этого печатает адрес, на котором расположен массив.

Вам понадобится механизм для выгрузки всего массива, как в этом SO-ответе .

...