C Libmcrypt не может успешно зашифровать / расшифровать - PullRequest
1 голос
/ 18 октября 2011

Я работаю с 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;
}

1 Ответ

1 голос
/ 18 октября 2011

Вам необходимо повторно инициализировать дескриптор mfd для дешифрования, вы не можете использовать один и тот же дескриптор для шифрования и дешифрования.

...