想象一下我做了以下事情:
$ 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。也许还有很多事情要做。
任何提示将不胜感激。