2012-01-17 5 views
1

wikipedia page on TwoFish указывает на это reference implementation in Ccode), что хорошо, но ему не хватает main, и мои первые несколько проходов при реализации одного из них неправильно обработали какие-либо из «известных векторных» тестовых примеров, которые я пытался. Я подозреваю, что я смотрю на проблему неправильного использования API, но я не знаю, с чего начать искать ошибку. Вместо того, чтобы бить голову о том, что один, я предпочел бы начать с кодовым что:Рабочая эталонная реализация TwoFish?

  1. Запускается из коробки
  2. Has ИСПЫТАНИЙ
  3. ли самодостаточных
  4. Is для ввода текста

I al поэтому имеют сильное предпочтение для C или C, например, кода на C++.


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

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

ответ

-1

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

0

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

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

+0

Возможно ли онлайн-копия источника? Кроме того, все, что использует 'read()' или 'write()', далеки от самодостаточного. OTOH Я ожидаю, что смогу снести его, если я не смогу найти что-то лучше. – BCS

+0

Здесь вы можете найти исходный архив: http://packages.ubuntu.com/precise/cryptcat - посмотрите в столбце справа рядом с серединой страницы. Я не знаю, есть ли удобный источник для просмотра в любом месте. – sarnold

+0

В следующий раз я посмотрю на tarball в системе с tar:/ – BCS

0

если вы взяли всего минуту прочитать эталонную реализацию, предоставляемую libObfuscate вы бы нашли cut'n'paste пример использования 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); 

Никаких серьезных эталонная реализация не будет еще, но реализация ЕЦБ один-блок.

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

+0

Глядя на этот код, это не принесло бы мне пользы: у него нет фактических значений (или, насколько я вижу, основная функция). Как бы то ни было, проблема заключалась в том, что я не смог правильно зарегистрировать порядок байтов. – BCS

0

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

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

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

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

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

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

Смежные вопросы