AES_128_CB C Шифрование / дешифрование с использованием OpenSSL - PullRequest
3 голосов
/ 13 февраля 2020

В настоящее время я пытаюсь разработать программу C для реализации AES_128_CB C с использованием библиотеки OpenSSL. Когда я компилирую и запускаю программу в первый раз, я получаю блоки зашифрованного текста, а затем мой открытый текст отображается как расшифрованный. Это, кажется, работает гладко. Моя проблема, когда я собираю и запускаю снова. Мои блоки зашифрованного текста увеличиваются (примерно в 3 раза), но моя расшифровка остается прежней. Я ожидаю, что если бы я использовал один и тот же ключ и IV, мой зашифрованный текст оставался бы неизменным независимо от того, сколько раз я компилировал и запускал программу. Кто-нибудь может понять, почему это может происходить?

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

#define BUFSIZE 1024

/* AES key for Encryption and Decryption */
const static unsigned char aes_key[]= {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF};
unsigned char iv[] = {0x98,0x76,0x54,0x32,0x10,0xFE,0xDC,0xBA,0x98,0x76,0x54,0x32,0x10,0xFE,0xDC,0xBA};
/* Print Encrypted and Decrypted data packets */
void print_data(const char *tittle, const void* data, int len);

int main( )
{
/* Input data to encrypt */
unsigned char aes_input[BUFSIZE];
strcpy(aes_input, "Testing");

fprintf(stderr, "%s\n", aes_input);


/* Init vector */

memset(iv, 0x00, AES_BLOCK_SIZE);

/* Buffers for Encryption and Decryption */
unsigned char enc_out[sizeof(aes_input)];
unsigned char dec_out[sizeof(aes_input)];
unsigned char *e = enc_out;

/* AES-128 bit CBC Encryption */
AES_KEY enc_key, dec_key;
AES_set_encrypt_key(aes_key, sizeof(aes_key)*8, &enc_key);
AES_cbc_encrypt(aes_input, enc_out, sizeof(aes_input), &enc_key, iv, AES_ENCRYPT);
fprintf(stderr, "Encrypted:");
while (*e) printf(" [%02x]", *e++);
printf("\n");

/* AES-128 bit CBC Decryption */
memset(iv, 0x00, AES_BLOCK_SIZE); // don't forget to set iv vector again, else you can't decrypt data properly

AES_set_decrypt_key(aes_key, sizeof(aes_key)*8, &dec_key); // Size of key is in bits
AES_cbc_encrypt(enc_out, dec_out, sizeof(aes_input), &dec_key, iv, AES_DECRYPT);

fprintf(stderr, "The Plaintext After Decryption is: %s\n", dec_out);


return 0;

}

1 Ответ

4 голосов
/ 13 февраля 2020

Вы пропустили несколько вещей в своем коде.

Сначала вы объявили свой массив aes_input без его инициализации:

/* Input data to encrypt */
unsigned char aes_input[BUFSIZE];

Поскольку вы не инициализировали этот массив, это может иметь любое значение после этого. Различные компиляторы будут делать разные вещи здесь. Одним из способов инициализации всего массива до предсказуемого значения является заполнение его нулями, например:

unsigned char aes_input[BUFSIZE] = {0};

После этого вывод должен быть предсказуемым, независимо от того, сколько раз вы его запустите.

Содержимое всего этого массива является релевантным, поскольку вы просите OpenSSL зашифровать весь массив, поскольку вы передаете sizeof(aes_input) в качестве размера открытого текста, который должен быть зашифрован при вызове функции AES_cbc_encrypt():

AES_cbc_encrypt(aes_input, enc_out, sizeof(aes_input), &enc_key, iv, AES_ENCRYPT);

Поскольку ваш ввод в значительной степени неинициализирован (за исключением первых восьми байтов, которые содержат строку «Тестирование»), вывод этой функции не может быть предсказан.

Теперь, когда вы печатаете это выведите следующее:

while (*e) printf(" [%02x]", *e++);

вы увидите только байты до первого байта со значением 0. Это ошибка, потому что зашифрованный текст может легко (и содержит) байты со значением 0. Вы рассматриваете зашифрованный текст, как будто это строка с нулевым символом в конце, а это не так. Вместо остановки при обнаружении значения 0 вы должны l oop на все байты в зашифрованном тексте.

...