| 一般的な | |
|---|---|
| デザイナー | ブルース・シュナイアー[1] |
| 初版 | 1993年[1] |
| 後継者 | トゥーフィッシュ |
| 暗号の詳細 | |
| キーサイズ | 32~448 ビット |
| ブロックサイズ | 64ビット |
| 構造 | フェイステルネットワーク |
| ラウンド | 16 |
| 最高の公開暗号解読 | |
| 4ラウンドのBlowfishは2次差分攻撃に対して脆弱である(Rijmen、1997)[2] 。弱い鍵のクラスの場合、14ラウンドのBlowfishは疑似ランダム順列と区別できる(Vaudenay、1996)。 | |
Blowfish は対称鍵 ブロック暗号で、1993 年にブルース・シュナイアーによって設計され、多くの暗号スイートや暗号化製品に含まれています。Blowfish はソフトウェアで優れた暗号化率を提供し、小さいファイルに対してはこれまで有効な暗号解読法は見つかっていません。4GB を超えるサイズのファイルの暗号化には Blowfish を使用せず、代わりにTwofish を使用することをお勧めします。[3]
Blowfishは64ビットのブロックサイズを持っているため、Sweet32バースデー攻撃に対して脆弱である可能性があります。[4]
シュナイアーは、老朽化したDESの代替として、他のアルゴリズムに伴う問題や制約のない汎用アルゴリズムとしてBlowfishを設計した。Blowfishがリリースされた当時、他の多くの設計は独占的であったり、特許によって制約されていたり、企業や政府の秘密であったりした。シュナイアーは「Blowfishは特許を取得していないし、すべての国でその状態が続くだろう。このアルゴリズムはパブリックドメインに置かれ、誰でも自由に使用できる」と述べた。[5]
設計の注目すべき特徴としては、キー依存のS ボックスと非常に複雑なキー スケジュールが挙げられます。
アルゴリズム
Blowfishは64ビットのブロックサイズと32ビットから448ビットまでの可変キー長を持つ。 [5]これは16ラウンドのFeistel暗号であり、大きなキー依存Sボックスを使用する。構造的には固定Sボックスを使用するCAST-128に似ている。

隣の図は、Blowfish の暗号化ルーチンを示しています。各行は 32 ビットを表します。サブキー配列は 5 つあります。1 つは 18 エントリの P 配列 (プレーンテキストとの混同を避けるため、図では K と表記)、もう 1 つは 256 エントリの S ボックス (S0、S1、S2、S3) です。
各ラウンドは4 つのアクションで構成されます。
F関数は32ビットの入力を4つの8ビットの4分の1に分割し、その4分の1をSボックスへの入力として使用します。Sボックスは8ビットの入力を受け取り、32ビットの出力を生成します。出力は2 32を法として加算され、XORされて最終的な32ビットの出力が生成されます(右上隅の画像を参照)。[6]
16 ラウンド目以降は、最後のスワップを元に戻し、L と K18、R と K17 を XOR します (出力ホワイトニング)。
復号化は暗号化とまったく同じですが、P1、P2、...、P18 が逆の順序で使用されます。これは、XOR が可換かつ結合的であるため、それほど明白ではありません。よくある誤解は、暗号化の逆の順序を復号化アルゴリズムとして使用することです (つまり、最初に P17 と P18 を暗号文ブロックに XOR し、次に P エントリを逆の順序で使用します)。
Blowfish のキー スケジュールは、P 配列と S ボックスを、明らかなパターンを含まないpiの16 進数字から導出された値で初期化することから始まります (私の袖の番号に何も隠されていないことを参照してください)。次に、秘密キーがバイトごとに、必要に応じてキーを循環させ、すべての P エントリと順番に XOR されます。次に、64 ビットのすべてゼロのブロックが、そのままのアルゴリズムで暗号化されます。結果の暗号文は、 P 1と P 2を置き換えます。次に、同じ暗号文が新しいサブキーで再度暗号化され、新しい暗号文が P 3と P 4を置き換えます。これが続けられ、P 配列全体とすべての S ボックス エントリが置き換えられます。全体として、Blowfish 暗号化アルゴリズムは、すべてのサブキーを生成するために 521 回実行され、約 4 KB のデータが処理されます。
P 配列の長さは 576 ビットで、初期化中にキー バイトが 576 ビットすべてに対して XOR 演算されるため、多くの実装では最大 576 ビットのキー サイズがサポートされます。その理由は、448 ビット キーを使用するオリジナルの Blowfish の説明と、576 ビット キーを使用するリファレンス実装との間に食い違いがあるためです。サードパーティの実装を検証するためのテスト ベクトルも、576 ビット キーを使用して作成されました。どの Blowfish バージョンが正しいか尋ねられたとき、Bruce Schneier は次のように答えました。「テスト ベクトルは、真の Blowfish を特定するために使用されるべきです。」
もう一つの意見は、448 ビットの制限は、すべてのサブキーのすべてのビットがキーのすべてのビットに依存することを保証するために存在しているというものです。 [5] P 配列の最後の 4 つの値は暗号文のすべてのビットには影響しないからです。この点は、ラウンド数が異なる実装では考慮する必要があります。徹底的な攻撃に対するセキュリティは向上しますが、アルゴリズムによって保証されるセキュリティは弱まります。また、キーが変更されるたびに暗号の初期化が遅くなるため、ブルート フォース攻撃に対する自然な保護が付与されますが、448 ビットを超えるキー サイズは実際には正当化されません。
疑似コードでのBlowfish
P[18] // 18要素のP配列
S[4][256] // Sボックス: 256要素の4つの配列
関数f(x):
// S-boxとビット操作を使用して、32ビットの入力xに対して関数fを計算します。high_byte
:= (xを24ビット右にシフト)
second_byte := (x を16ビット右にシフト) AND 0xff
third_byte := (x を8ビット右にシフト) AND 0xff
low_byte := xかつ0xff
h := S[0][上位バイト] + S[1][第2バイト]
(h XOR S[2][third_byte])+ S[3][low_byte]を返す
手順blowfish_encrypt(L, R):
// P配列と関数fを使用して、2つの32ビット半分LとRを16ラウンドにわたって暗号化します
(ラウンド:= 0から15)。
L := L XOR P[丸め]
R := f(L) XOR R
LとRの値を入れ替える
LとRの値を入れ替える
R := R XOR P[16]
L := L排他的論理和P[17]
手順blowfish_decrypt(L, R):
// P 配列と関数 f を使用して、2 つの 32 ビット半分 L と R を 16 ラウンドにわたって逆順に復号します
( round := 17から2まで)。
L := L XOR P[丸め]
R := f(L) XOR R
LとRの値を入れ替える
LとRの値を入れ替える
R := R XOR P[1]
L := L排他的論理和P[0]
//指定されたキーを使用して P 配列と S ボックスを初期化し、その後キーを拡張します
//キー値を使用して P 配列を初期化します
キー位置:= 0
i := 0から17の場合:
0 := 0 です
j := 0から3の場合:
k := (k を8ビット左にシフト) OR key[key_position]
key_position := (key_position + 1) mod key_length
P[i] := P[i] XOR k
// Blowfish キー拡張 (521 回の反復)
L := 0、R := 0
i := 0から17までを2で割った値:
blowfish_encrypt(L, R)
P[i] := L
P[i + 1] := R
// L と R を暗号化して S ボックスを埋めます
。i := 0から3:
j := 0から255まで2 :
blowfish_encrypt(L, R)
S[i][j] := L
S[i][j + 1] := R
フグの実践
Blowfish は、キーを変更する場合を除いて、高速なブロック暗号です。新しいキーごとに、約 4 キロバイトのテキストを暗号化するのと同等の前処理が必要であり、他のブロック暗号に比べて非常に低速です。このため、特定のアプリケーションでは使用できませんが、他のアプリケーションでは問題になりません。
Blowfish はキーを使用して初期化する必要があります。使用する前に、このキーをHash_function を使用してハッシュしておくことをお勧めします。
あるアプリケーションでは、Blowfish の低速なキー変更は実際には利点です。OpenBSDで使用されるパスワードハッシュ メソッド (crypt $2、つまり bcrypt) は、低速キー スケジュールを利用するBlowfishから派生したアルゴリズムを使用します。この考え方は、必要な追加の計算作業によって辞書攻撃に対する保護が得られるというものです。キー ストレッチングを参照してください 。
Blowfish のメモリ フットプリントは、 RAMで 4 キロバイト強です。この制約は、古いデスクトップ コンピュータやラップトップ コンピュータでも問題にはなりませんが、初期のスマート カードなどの最小の組み込みシステムでは使用できません。
Blowfish は、特許の対象とならない最初の安全なブロック暗号の 1 つであり、誰でも自由に使用できます。この利点により、暗号化ソフトウェアで Blowfish が人気を博しています。
bcrypt はパスワード ハッシュ関数であり、可変の反復回数 (作業「コスト」) と組み合わせることで、Blowfish のコストの高いキー設定フェーズを利用してハッシュ計算の作業負荷と期間を増やし、ブルート フォース攻撃の脅威をさらに軽減します。
bcryptは、2002年に開発されたBlowfishを実装したクロスプラットフォームのファイル暗号化ユーティリティの名前でもあります。[7] [8] [9] [10]
弱点と後継者
Blowfish は 64 ビットのブロック サイズ (AES の 128 ビット ブロック サイズとは対照的) を使用しているため、特にHTTPSなどのコンテキストではバースデー攻撃に対して脆弱です。2016 年に、SWEET32 攻撃は、バースデー攻撃を利用して 64 ビット ブロック サイズの暗号に対して平文復元 (つまり、暗号文の復号化) を実行する方法を実証しました。[11] GnuPGプロジェクトは、ブロック サイズが小さいため、4 GB を超えるファイルの暗号化には Blowfish を使用しないことを推奨しています[3] 。 [4]
Blowfishのラウンド数を減らしたバージョンは、反射的に弱い鍵に対する既知平文攻撃に対して脆弱であることが知られています。Blowfishの実装では16ラウンドの暗号化が使用され、この攻撃の影響を受けません。[12] [13]
ブルース・シュナイアーはBlowfishの後継であるTwofishへの移行を推奨している。[14]
Blowfish2は2005年にリリースされ、ブルース・シュナイアー以外の人々によって開発されました。全く同じ設計ですが、Sテーブルが2倍あり、32ビット整数の代わりに64ビット整数を使用します。64ビットブロックではなく、AESのような128ビットブロックで動作します。Blowfish2は、たとえばFreePascalで使用されています。[15] [16]
参照
参考文献
- ^ ab R. Shirey (2007 年 8 月). インターネット セキュリティ用語集、バージョン 2. ネットワーク ワーキング グループ. doi : 10.17487/RFC4949 . RFC 4949. 情報提供。
- ^ Vincent Rijmen (1997). 「反復ブロック暗号の暗号解析と設計」( PostScript )。博士論文。2013年5月8日時点のオリジナルよりアーカイブ。
- ^ ab 「GnuPG よくある質問」。2017 年 12 月 21 日にオリジナルからアーカイブ。2018 年 1 月 26 日に取得。Blowfish
は 4Gb を超えるサイズのファイルの暗号化には使用しないでください。ただし、Twofish にはそのような制限はありません。
- ^ ab 「GnuPG よくある質問」。2017 年 12 月 21 日にオリジナルからアーカイブ。2018 年 1 月 27 日に取得。8
バイトのブロック サイズの暗号では、おそらく 32 ギガバイトのデータごとにブロックが繰り返されます。つまり、32 ギガバイトを超える単一のメッセージを暗号化すると、統計的にブロックが繰り返される可能性が高くなります。これはよくありません。このため、バルク暗号化を行う場合は、8 バイトのデータ ブロックを持つ暗号を使用しないことをお勧めします。メッセージのサイズを 4 ギガバイト未満に抑えれば、問題が発生する可能性はほとんどありません。
- ^ abc Bruce Schneier (1993). 「新しい可変長キー、64ビットブロック暗号(Blowfish)の説明」。高速ソフトウェア暗号化、ケンブリッジセキュリティワークショップ議事録。Springer -Verlag:191–204。2014年1月26日時点のオリジナルよりアーカイブ。
- ^ 「暗号化:新しい可変長キー、64 ビット ブロック暗号 (Blowfish) の説明」。Schneier on Security。2016年 3 月 4 日時点のオリジナルよりアーカイブ。2015年 12 月 31 日閲覧。
- ^ 「Bcrypt - Blowfish ファイル暗号化」 2015-08-29 にWayback Machineでアーカイブbcrypt ファイル暗号化プログラムのホームページ (bcrypt.sourceforge.net)
- ^ 「bcrypt 無料ダウンロード - whodunnit.tools.bcrypt」。bcrypt463065.android.informer.com。2016年3月4日時点のオリジナルよりアーカイブ。2018年5月7日閲覧。
- ^ 「T2 パッケージ - trunk - bcrypt - ファイルを暗号化するユーティリティ」www.t2-project.org。 2017 年 4 月 21 日時点のオリジナルよりアーカイブ。2018 年5 月 7 日閲覧。
- ^ “Oracle GoldenGateのライセンス”. docs.oracle.com。 2017 年 10 月 27 日のオリジナルからアーカイブ。2018 年5 月 7 日に取得。
- ^ Karthikeyan Bhargavan、Gaëtan Leurent (2016 年 8 月)。「64 ビット ブロック暗号の実際的な (不) セキュリティについて - TLS および OpenVPN 経由の HTTP に対する衝突攻撃」ACM CCS 2016。2016 年 10 月 9 日のオリジナルからアーカイブ。
- ^ Tom Gonzalez (2007 年 1 月)。「Blowfish に対するリフレクション攻撃」(PDF)。Journal of LATEX Class Files。2015年 11 月 18 日のオリジナル(PDF)からアーカイブ。2015年 11 月 17 日に取得。
- ^ Orhun Kara & Cevat Manap (2007 年 3 月)。「Blowfish 用の新しいクラスの弱い鍵」(PDF)。FSE 2007。2016年 10 月 5 日のオリジナルからアーカイブ(PDF) 。
- ^ Dahna, McConnachie (2007-12-27). 「Bruce Almighty: Schneier preaches security to Linux believed to be a faith」. Computerworld . p. 3. 2016-12-02 にオリジナルからアーカイブ。2018-01-26に取得。
しかし、この時点で、それがまだ使用されていることに驚いています。尋ねられたら、代わりに Twofish をお勧めします。
- ^ 「Blowfish2 が Feepascal に含まれています」。Gitlab。
- ^ 「Blowfish2 on Github」。Github。
外部リンク
- ブルース・シュナイアー。「Blowfish 暗号化アルゴリズム」。
- ブルース・シュナイアー。「フグを使った製品」
- 「標準暗号化アルゴリズムの命名: Blowfish」。
