AES в режиме ECB с библиотекой OpenSSL не дает ожидаемых результатов

Я пытался поближе познакомиться с библиотекой OpenSSL и для этого хотел создать несколько программ, которые шифровали бы текст, используя различные режимы работы. Я создал программу, которую хочу зашифровать и расшифровать в режиме ECB, но результаты оказались не такими, как я ожидал.

Ниже приведен код, который у меня есть.

#include <stdio.h>
#include <openssl/aes.h>
#include <string.h>
#include <stdlib.h>
#include <openssl/rand.h>


//static const unsigned char key[]={01234567890123456789012345678900};


int main()
{


    int keylength;
    printf("Give a key length [only 128 or 192 or 256!]:\n");
    scanf("%d", &keylength);

    /* generate a key with a given length */
    unsigned char aes_key[keylength];
    memset(aes_key, 0, sizeof(aes_key));
    if (!RAND_bytes(aes_key, keylength))
     {
        exit(-1);
     }
    aes_key[keylength-1] = '\0';

    unsigned char text[] = "TestText TestText"; //Assign text to be encrypted
    unsigned char enc_out[AES_BLOCK_SIZE]; //Set to 16 bytes
    unsigned char dec_out[AES_BLOCK_SIZE];

    AES_KEY enc_key, dec_key; //establish AES enc and dec key

    AES_set_encrypt_key(aes_key, 128, &enc_key); 
    AES_encrypt(text, enc_out, &enc_key);

    AES_set_decrypt_key(aes_key, 128, &dec_key);
    AES_decrypt(enc_out, dec_out, &dec_key);

    int x;

    printf("original:\t");
    for(x=0;*(text+x)!=0x00;x++)          
    printf("%X ",*(text+x));
    printf("\nencrypted:\t");
    for(x=0;*(enc_out+x)!=0x00;x++)
    printf("%X ",*(enc_out+x));
    printf("\ndecrypted:\t");
    for(x=0;*(dec_out+x)!=0x00;x++)
    printf("%X ",*(dec_out+x));
    printf("\n");

    return 0;
} 

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

original: 54 65 73 74 54 65 78 74 2E 20 20 54 65 73 74 54 65 78 74 2E
encrypted: A2 FE 93 40 F5 92 95 F A2 5A D0 4A A6 53 95 58 54 65 73 74
           54 65 78 74 2E 20 20 54 65 73 74 54 54 65 73 74 54 65 78 74
           2E 20 20 54 65 73 74 54 65 78 74 2E
decrypted: 54 65 73 74 54 65 78 74 2E 20 20 54 65 73 74 54 54 65 73 74
           54 65 78 74 2E 20 20 54 65 73 74 54 65 78 74 2E

Во-первых, у меня входной текст превратился в шестнадцатеричный, затем он должен быть зашифрован с использованием режима ECB, и, наконец, все должно быть расшифровано. Две зашифрованные строки текста идентичны, но в шестнадцатеричном формате это не показано. Одинаковый открытый текст не разделяет один и тот же зашифрованный текст. Гексагон открытого текста также, похоже, следит за зашифрованным текстом, и я не уверен, почему это происходит. Может ли кто-нибудь пролить свет на то, почему шифрование не работает должным образом? Есть ли ошибки в моем коде, которые не дают необходимых результатов? Любая помощь приветствуется. Спасибо

1 ответ

Здесь несколько вещей не так.

Первое: вы смешиваете размеры в битах и ​​байтах. Длина 128-битного ключа составляет 16 байтов, а не 128 байтов. Это в основном безвредно, так как вы просто генерируете слишком большой ключ.

Второе: вы предполагаете, что входы и выходы AES, включая ключи, имеют нулевое завершение. Они не. Все, что выходит за первые 16 байтов вывода, которое вы печатаете, является случайным мусором, и ключ не (и не должен быть!) Завершается нулем.

Третье: ваш тестовый ввод ("TestText TestText") слишком длинный, чтобы поместиться в один блок AES. AES_encrypt() работает только на одном блоке.

Другие вопросы по тегам