如何使用libmcrypt在C语言中解密twofish CBC?

时间:2019-09-24 02:43:13

标签: c encryption mcrypt encryption-symmetric

想象一下我做了以下事情:

$ 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

但是它只会打印垃圾。

我怀疑我必须更改读取stdin的while循环上的逻辑,因为它最初是为CFB编写的,而我使用的是CBC。也许还有很多事情要做。

任何提示将不胜感激。

0 个答案:

没有答案