Я взял реализацию Нилса Фергюсона, одного из дизайнеров 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. Я не пробовал, поэтому не могу комментировать, как легко интегрировать.