Как использовать libmcrypt для расшифровки двух CBC в C? - PullRequest
1 голос
/ 24 сентября 2019

Представьте, что я сделал следующее:

$ echo a | mcrypt > b.nc

и набрал test123 в качестве пароля / ключевой фразы.Я предполагаю, что mcrypt будет использовать twofish и CBC по умолчанию.

Я хочу использовать libmcrypt и написать программу на C для декодирования содержимого b.nc.

Я изменил пример из https://github.com/winlibs/libmcrypt/blob/master/doc/example.c

#include <mcrypt.h>
#include <stdio.h>
#include <stdlib.h>

main() {

    MCRYPT td;
    int i;
    char *key;
    char password[20];
    char block_buffer;
    char *IV;
    int keysize=19; /* 128 bits */

    key=calloc(1, keysize);
    strcpy(password, "test123");

/* Generate the key using the password */
/*  mhash_keygen( KEYGEN_MCRYPT, MHASH_MD5, key, keysize, NULL, 0, password, strlen(password));
 */
    memmove( key, password, strlen(password));

    td = mcrypt_module_open("twofish", NULL, "cbc", NULL);
    if (td==MCRYPT_FAILED) {
        return 1;
    }
    IV = malloc(mcrypt_enc_get_iv_size(td));

/* Put random data in IV. Note these are not real random data,
 * consider using /dev/random or /dev/urandom.
 */

    /*  srand(time(0)); */
    for (i=0; i< mcrypt_enc_get_iv_size( td); i++) {
        IV[i]=rand();
    }

    i=mcrypt_generic_init( td, key, keysize, IV);
    if (i<0) {
        mcrypt_perror(i);
        return 1;
    }

    /* Encryption in CFB is performed in bytes */
    while ( fread (&block_buffer, 1, 1, stdin) == 1 ) {
        // mcrypt_generic (td, &block_buffer, 1);

/* Comment above and uncomment this to decrypt */
        mdecrypt_generic (td, &block_buffer, 1);

        fwrite ( &block_buffer, 1, 1, stdout);
    }
    mcrypt_generic_deinit(td);

    mcrypt_module_close(td);

    return 0;

}

Встраивается в исполняемый файл mcrypt_dev.Я попытался выполнить дешифрование, вызвав

$ cat b.nc | ./mcrypt_dev

, но он просто печатает мусор.

Я подозреваю, что должен изменить логику в цикле while, который читает stdin, потому что он изначально был написан дляCFB и я использую CBC вместо этого.Возможно, это еще не все.

Любые советы будут высоко оценены.

...