Рабочая эталонная реализация TwoFish? - PullRequest
1 голос
/ 17 января 2012

Страница википедии на TwoFish указывает на эту эталонную реализацию в C code ), что хорошо, но ей не хватает main и мой первые несколько проходов при реализации одного неправильно обрабатывали ни один из тестовых случаев «известного вектора», которые я пытался выполнить. Я подозреваю, что смотрю на проблему неправильного использования API, но я не знаю, с чего начать поиск ошибки. Вместо того, чтобы бить меня головой об этом, я бы лучше начал с кодовой базы, которая:

  1. Запускается из коробки
  2. Есть тесты
  3. Является автономным
  4. Написано для ясности

У меня также есть сильные предпочтения в C или C, как в коде C ++.


Примечание. На данный момент меня больше интересует читаемость кода, чем все остальное. Небольшой, простой код, который может зашифровать и расшифровать один блок, и основная функция, которая жестко кодирует вызов или три, будет идеальным. Почти все, что за этим (как и любой пользовательский интерфейс) будет просто шумом для моего варианта использования.

Кроме того, все, что имеет лицензию, более ограничивающую, чем Boost, будет полезно для меня только как источник знания хороших значений и состояний для сравнения.

Ответы [ 4 ]

1 голос
/ 30 августа 2012

Я взял реализацию Нилса Фергюсона, одного из дизайнеров Twofish, и обернул ее (очень легко, с небольшими изменениями) в C ++, и она работает хорошо. Я должен подчеркнуть, что я почти не работал здесь, и не претендую на то, чтобы понять, как работает Twofish (и это после того, как я прочел об этом - но мне слишком трудно следовать).

Конструктор выполняет всестороннее тестирование и прерывает работу, если тесты не пройдены, поэтому, когда у вас есть полностью построенный объект, вы знаете, что он будет работать.

Я поместил источники здесь: http://www.cartotype.com/assets/downloads/twofish/.

В файлах есть различные настраиваемые элементы одну из них, которую вы можете изменить, - это функция прерывания Twofish_fatal, которая в моей версии пытается записать адрес 0 для принудительного выхода, но на некоторых платформах это не работает.

Как и код, упомянутый выше, все, что он делает, это кодирует одиночные 16-байтовые блоки (ECB = режим электронной кодовой книги). Но очень легко реализовать лучший режим поверх него, например, цепочку шифровавшего слова, в которой каждый блок простого текста перед шифрованием передается XOR с предыдущим блоком зашифрованного текста (используйте случайный «вектор инициализации» из 16 байтов для первый блок и передать его вместе с зашифрованными данными).

Другая реализация может быть найдена в исходном коде программы базы данных паролей Брюса Шнайера с открытым исходным кодом PasswordSafe: соответствующие источники здесь: http://passwordsafe.git.sourceforge.net/git/gitweb.cgi?p=passwordsafe/pwsafe.git;a=tree;f=pwsafe/pwsafe/src/core;hb=HEAD. Я не пробовал, поэтому не могу комментировать, как легко интегрировать.

0 голосов
/ 19 января 2012

В конце концов я обнаружил эту реализацию Python , полученную из имплементации C, которую я перечислил выше. Основной причиной моих проблем оказалось то, что слова ключа были в неправильном порядке.

0 голосов
/ 10 февраля 2012

если бы ты потратил всего минуту, чтобы прочитать эталонная реализация, предоставленная libObfuscate Вы бы нашли пример использования TwoFish.

// Encrypt : outBuf [16] = Twofish ECB ( inBuf [16] )
TWOFISH_STATIC_DATA twofish; 
BYTE passw [32]; 
BYTE inBuf [16] , outBuf [16]; 

memset( &twofish , 0 , sizeof( TWOFISH_STATIC_DATA ) ); 
Twofish_set_key( &twofish.key , ( DWORD * ) passw , 256 );
Twofish_encrypt( &twofish.key , ( DWORD * ) inBuf , ( DWORD * ) outBuf );   

Никакой серьезной РЕАЛИЗАЦИИ иначе, кроме реализации ECB с одним блоком.

Если вы хотите зашифровать больше данных, вам нужно выбрать блок шифрования режим цепочки (CBC, ecc ...) и применить его поверх ECB.

0 голосов
/ 17 января 2012

Пакет cryptcat в Ubuntu и Debian обеспечивает nc(1) -подобную функциональность со встроенной функцией twofish.

Поддержка twofish предоставляется в twofish2.cc и twofish2.h в пакете с исходным кодом.farm9crypt.cc обеспечивает слой между функциональностью read() и write() в стиле C и двояким алгоритмом - это стиль, который я бы назвал C ++, как C ++.

...