Я работаю с libmcrypt в c и пытаюсь реализовать простой тест шифрования и дешифрования, используя rijndael-256 в качестве алгоритма выбора. Я отразил эту реализацию теста довольно близко к примерам страниц man с rijndael, в отличие от выбранных ими алгоритмов. При компиляции со строкой gcc -o encryption_test main.c -lmcrypt следующий исходный код производит вывод, подобный следующему:
Буфер зашифрованных сообщений содержит j A 8 qj % ` jh = ZЁ j
Исходная строка была m " C D Y G v6 s zh
Очевидно, что часть дешифрования выходит из строя, но поскольку это всего лишь один вызов функции, это заставляет меня поверить, что схема шифрования также работает некорректно. У меня есть несколько вопросов к гуру libmcrypt, если бы вы могли указать мне правильное направление.
Во-первых, что является причиной того, что этот код производит этот некорректный вывод?
Во-вторых, при работе с обязательными фиксированными размерами, такими как размер ключа и размер блока, например, 256-битный ключ, ожидает ли функция 32 байта ключа + завершающий нулевой байт, 31 байта ключа + завершающий нулевой байт или 32-байтовый ключ, причем 33-й байт не имеет значения? Тот же вопрос относится и к размеру блока.
Наконец, один из примеров, которые я отметил, использовал mhash для генерации хэша ключевого текста для передачи в вызов шифрования, это, конечно, предпочтительнее, но оно было закомментировано, и связывание в mhash кажется неудачным. Каков приемлемый способ обработки этого типа преобразования ключей при работе с libmcrypt? Я решил исключить любые такие сложности, чтобы предотвратить дальнейшее усложнение уже сломанного кода, но я хотел бы включить это в окончательный дизайн. Ниже приведен исходный код:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <mcrypt.h>
int main(int argc, char *argv[])
{
MCRYPT mfd;
char *key;
char *plaintext;
char *IV;
unsigned char *message, *buffered_message, *ptr;
int i, blocks, key_size = 32, block_size = 32;
message = "Test Message";
/** Buffer message for encryption */
blocks = (int) (strlen(message) / block_size) + 1;
buffered_message = calloc(1, (blocks * block_size));
key = calloc(1, key_size);
strcpy(key, "&*GHLKPK7G1SD4CF%6HJ0(IV#X6f0(PK");
mfd = mcrypt_module_open(MCRYPT_RIJNDAEL_256, NULL, "cbc", NULL);
if(mfd == MCRYPT_FAILED)
{
printf("Mcrypt module open failed.\n");
return 1;
}
/** Generate random IV */
srand(time(0));
IV = malloc(mcrypt_enc_get_iv_size(mfd));
for(i = 0; i < mcrypt_enc_get_iv_size(mfd); i++)
{
IV[i] = rand();
}
/** Initialize cipher with key and IV */
i = mcrypt_generic_init(mfd, key, key_size, IV);
if(i < 0)
{
mcrypt_perror(i);
return 1;
}
strncpy(buffered_message, message, strlen(message));
mcrypt_generic(mfd, buffered_message, block_size);
printf("The encrypted message buffer contains %s\n", buffered_message);
mdecrypt_generic(mfd, buffered_message, block_size);
printf("The original string was %s\n", buffered_message);
mcrypt_generic_deinit(mfd);
mcrypt_module_close(mfd);
return 0;
}