Мне нужно зашифровать массив 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
Вы используете эталонную реализацию, и вы проверяете их * используя случайный веб-сайт *? Разве вы не думаете, что это не так? Как насчет сравнения с [Twofish] (https://www.schneier.com/code/ecb_ival.txt) и [Змей] (http://www.cs.technion.ac.il/~biham/Reports/Serpent /Serpent-128-128.verified.test-vectors) тестовые векторы? –
@Laura Renoldi: Не знаю, какую реализацию вы используете, но здесь: http://cpansearch.perl.org/src/MLEHMANN/Crypt-Twofish2-1.02/twofish.c, например, - говорит, что makeKey должен получить ключ, закодированный как шестнадцатеричная строка. Поэтому, если ваш ключ говорит 255 255 255, вы должны передать «FFFFFF». –
Обратите внимание, что если я введу все как шестнадцатеричные на сайте (как и должно быть), я получаю правильное значение для данных тестовых векторов, как для двухрядных, так и для змеиных (128-битные ключи). Обратите внимание, что ключ для змеи начинается с 8 вместо нуля. –