2015-04-02 3 views
1

Мне нужно зашифровать массив unsigned char (длиной 16 байт) с помощью Serpent и Twofish. Я использую две библиотеки -write в c- с официального сайта. Я пытаюсь использовать их, но зашифрованный текст, который я получу, неверен. Для проверки я использую это site. Я не понимаю, где ошибка.
Мой код:Библиотека Serpent и Twofish C

keyInstance keyTwofish; 
cipherInstance cipherTwofish; 
unsigned char *buffer_out_twofish; 

char path_file_twofish[DIM]; 
... 
//Twofish 
if(cipherInit(&cipherTwofish,MODE_ECB,NULL)!=TRUE) 
{ 
    perror("[ERROR] Function module02: makeKey.\n"); 
    return 0; 
} 
//key_dim*8=128 and key is an unsigned char key [16] that contain key 
makeKey(&keyTwofish, DIR_ENCRYPT, key_dim*8, key); 
… 
//Buffer in is unsigned char buffer_in[16] contain plaintext 
//byte_for_file=16 than byte_for_file*8=128 
//Buffer out is unsigned char buffer_out_twofish[16] 
blockEncrypt(&cipherTwofish, &keyTwofish, buffer_in, byte_for_file*8, buffer_out_twofish); 

Для Змеи такая же реализация.

При печати SizeOf типа переменной результат:

Size of Char: 1 
Size of Integer: 4 
Size of Long: 8 

И когда я делаю:

printf("\nPrint Char Array: "); 
for (int j = 0; j < byte_for_file; ++j) 
    printf("%x ", buffer_in[j]); 
printf("\nPrint long Array: "); 
test(buffer_in, byte_for_file); 

где

void test (unsigned long * a, int b) 
{ 
    for (int i = 0; i < b/sizeof(long); ++i) 
     printf("%lx ", a[i]); 
} 

я получаю это:

Print Char Array: 87 ae bd 58 71 75 1d 36 43 ab 1d ef 69 f5 54 d7 
Print long Array: 361d757158bdae87 d754f569ef1dab43 
+0

Вы используете эталонную реализацию, и вы проверяете их * используя случайный веб-сайт *? Разве вы не думаете, что это не так? Как насчет сравнения с [Twofish] (https://www.schneier.com/code/ecb_ival.txt) и [Змей] (http://www.cs.technion.ac.il/~biham/Reports/Serpent /Serpent-128-128.verified.test-vectors) тестовые векторы? –

+0

@Laura Renoldi: Не знаю, какую реализацию вы используете, но здесь: http://cpansearch.perl.org/src/MLEHMANN/Crypt-Twofish2-1.02/twofish.c, например, - говорит, что makeKey должен получить ключ, закодированный как шестнадцатеричная строка. Поэтому, если ваш ключ говорит 255 255 255, вы должны передать «FFFFFF». –

+0

Обратите внимание, что если я введу все как шестнадцатеричные на сайте (как и должно быть), я получаю правильное значение для данных тестовых векторов, как для двухрядных, так и для змеиных (128-битные ключи). Обратите внимание, что ключ для змеи начинается с 8 вместо нуля. –

ответ

0

Реализация, которую вы используете, ожидает ключ как keyLen/4 символа ASCII, представляющие шестнадцатеричные значения для ключа.

Таким образом, вы должны изменить строку:

makeKey(&keyTwofish, DIR_ENCRYPT, key_dim*8, key); 

в

makeKey(&keyTwofish, DIR_ENCRYPT, strlen(key)*4, key); 

Поскольку Hexvalues, как например. 0x30313233343536373839 не интерпретируются как, а как 0x0300030103020303030403050306030703080309, а ключбудет интерпретирован как 0x00010203040506070809.