1

TwoFishのウィキペディア ページは、C (およびコード)でのこの参照実装を示していますが、これには問題がmainありませんが、実装の最初の数パスでは、試みた「既知のベクトル」テスト ケースのいずれも正しく処理されませんでした。API を正しく使用していないという問題があると思われますが、どこからエラーを探し始めればよいかわかりません。そのことに頭を悩ませるのではなく、次のようなコードベースから始めたいと思います。

  1. すぐに使える
  2. テストあり
  3. 自己完結型
  4. わかりやすくするために書かれています

私はまた、C または C++ コードのような C を強く好みます。


注: 現時点では、何よりもコードの読みやすさに関心があります。1 つのブロックを暗号化および復号化できる小さくて単純なコードと、1 つまたは 3 つの呼び出しをハードコーディングするメイン関数が理想的です。それを超えるほとんどのもの (ユーザー インターフェイスなど) は、私のユース ケースでは単なるノイズになります。

また、Boost よりも制限の厳しいライセンスを持っているものは、比較するための既知の適切な値と状態の情報源としてのみ役立ちます。

4

4 に答える 4

2

Twofish の設計者の 1 人である Neils Ferguson による実装を採用し、C++ で (非常に軽く、ほとんど変更を加えずに) ラップしたところ、うまく機能しました。ここでほとんど作業を行っていないこと、Twofish がどのように機能するかを理解していると主張していないことを強く強調しておく必要があります (それはそれを読んだ後のことですが、理解するのは難しすぎます)。

コンストラクターは包括的なテストを行い、テストが失敗すると中断するため、完全に構築されたオブジェクトを取得すると、それが機能することがわかります。

ソースをここに置きました: https://www.cartotype.com/assets/downloads/twofish/ .

ファイルにはさまざまな構成可能なものがあります。変更したいのは中止関数の Twofish_fatal です。これは、私のバージョンではアドレス 0 に書き込んで強制的に終了させようとしますが、一部のプラットフォームでは機能しません。

上記のコードと同様に、これは単一の 16 バイト ブロックをエンコードするだけです (ECB = 電子コード ブック モード)。しかし、暗号ブロックチェーンのように、平文の各ブロックが暗号化の前に暗号文の前のブロックと XOR される、より良いモードをその上に実装するのは非常に簡単です (16 バイトのランダムな「初期化ベクトル」を使用します)。最初にブロックし、それを暗号化されたデータと一緒に送信します)。

別の実装は、Bruce Schneier のオープンソースのパスワード データベース プログラムである PasswordSafe のソース コードで見つけることができます。関連するソースは次のとおりです。 .git;a=tree;f=pwsafe/pwsafe/src/core;hb=HEAD . 試したことがないので、統合がどれほど簡単かについてはコメントできません。

于 2012-08-29T21:40:12.543 に答える
0

libObfuscateが提供するリファレンス実装を1分ほど読んだら、 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の上に適用する必要があります。

于 2012-02-10T18:24:56.110 に答える
0

UbuntuおよびDebiancryptcatパッケージは、twofish が組み込まれた のような機能を提供します。nc(1)

twofish サポートは、ソース パッケージ内で提供さtwofish2.ccれます。C スタイルと機能と twofish アルゴリズムの間のレイヤーを提供します。これは、私が C ライク C++ と呼ぶスタイルです。twofish2.hfarm9crypt.ccread()write()

于 2012-01-17T02:03:47.013 に答える
-1

最終的に、このPython実装は、上記のC実装から派生したものであることがわかりました。私の問題の根本的な原因は、キーの単語が間違った順序であったことであることが判明しました。

于 2012-01-19T19:32:11.743 に答える