Представьте, что я сделал следующее:
$ 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 вместо этого.Возможно, это еще не все.
Любые советы будут высоко оценены.