TwoFishの実用的なリファレンス実装?
-
29-10-2019 - |
質問
TwoFishのmain
がなく、実装の最初の数回のパスで、試行した「既知のベクトル」テストケースが正しく処理されませんでした。 APIを正しく使用していないという問題を調べているのではないかと思いますが、どこからエラーを探し始めるのかわかりません。その1つに頭を悩ませるのではなく、次のようなコードベースから始めたいと思います。
- すぐに使用できます
- テストあり
- 自己完結型
- わかりやすくするために書かれています
C ++コードのようにCまたはCも強く好みます。
注:現時点では、他の何よりもコードの可読性に関心があります。単一のブロックを暗号化および復号化できる小さくて単純なコードと、1つまたは3つの呼び出しをハードコーディングするメイン関数が理想的です。それを超えるほとんどのもの(他のユーザーインターフェイスなど)は、私のユースケースでは単なるノイズになります。
また、Boostよりも制限の厳しいライセンスを持っているものはすべて、比較するための適切な値と状態を知っている情報源としてのみ私に役立ちます。
解決 4
最終的に、上記のC実装から派生した
他のヒント
Twofishの設計者の1人であるNeilsFergusonによる実装を採用し、それをC ++でラップしました(非常に軽く、変更はほとんどありません)。これはうまく機能します。私はここでほとんど仕事をしていないことを強く強調しなければならず、Twofishがどのように機能するかを理解しているとは主張していません(そしてそれを読んだ後ですが、私がフォローするのは難しすぎます)。
コンストラクターは包括的なテストを実行し、テストが失敗すると中止するため、完全に構築されたオブジェクトができたら、それが機能することがわかります。
ソースをここに配置しました: http://www.cartotype.com/assets / downloads / twofish / 。
ファイルにはさまざまな構成可能なものがあります。変更したいものの1つは、中止関数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 。試したことがないので、統合がいかに簡単かについてはコメントできません。
Ubuntu およびnc(1)
のような機能を提供します。
twofishのサポートは、ソースパッケージのtwofish2.cc
とtwofish2.h
で提供されます。farm9crypt.cc
は、Cスタイルのread()
とwrite()
の機能とtwofishアルゴリズムの間にレイヤーを提供します。これは、私がCのようなC ++と呼ぶスタイルです。
読むのに1分しかかからなかった場合 libObfuscate によって提供されるリファレンス実装 TwoFishを使用したカットアンドペーストの例を見つけたでしょう。 ジェネラコディセタグプレ
深刻なリファレンス実装はありません それ以外の場合は、単一ブロックのECB実装です。
より多くのデータを暗号化する場合は、選択する必要があります
暗号ブロック