Blowfish(ブローフィッシュ)とは:Bruce Schneier設計の可変鍵64ビットブロック暗号
Blowfish(ブローフィッシュ)の設計者Bruce Schneier、可変鍵・64ビットブロック、性能と脆弱性、歴史と実装・比較(AES/Twofish)を徹底解説。
暗号学におけるBlowfishは、1993年にBruce Schneierによって設計された鍵付き対称ブロック暗号で、発表以来多くのソフトウェア製品やライブラリに採用されてきました。Blowfishはソフトウェア実装で高速に動作するよう設計されており、2008年頃までは公開されているフルラウンド版に対する決定的な暗号解析は報告されていませんでした。しかし近年は、より現代的な設計や大きなブロックサイズを持つ暗号(例えばAES)に関心が移っており、新規実装ではAESやTwofishなどが推奨されることが多くなっています。
設計の目的と性質
シュナイアー氏は当時広く使われていたDESの代替として、かつて多くがプロプライエタリであった暗号アルゴリズムの問題点を取り除くことを目的にBlowfishを設計しました。公開時に彼はBlowfishを非特許・公開仕様として提供し、「パブリックドメインとして公開され、誰でも自由に使用できる」と明言しています。
主要な仕様と特徴
- ブロックサイズ:64ビット(64 ビットのブロック)
- 鍵長:可変(一般に32ビットから448ビットまで) — 実用上は4バイトから56バイトの鍵が用いられます(元テキストの「0から448ビット」は誤記です)鍵長を持ちます。
- 構造:16ラウンドのFeistel 暗号
- S-ボックスとP配列:鍵依存の大きなSボックス(4つのSボックス、各256エントリ、各エントリは32ビット)と18個の32ビットからなるP配列を使用
- 固定S-boxを使うCAST-128と構造的な類似点がありますが、BlowfishはS-boxが鍵に依存する点が特徴です。
鍵スケジュール(初期化)の詳細とコスト
Blowfishの鍵スケジュールは鍵に強く依存し、初期化手順が比較的重い点が大きな特徴です。標準的な生成手順は次の通りです:
- まずP配列とSボックスを、円周率πの16進数展開などの既知定数で初期化する。
- 次に鍵のビット列を繰り返しP配列とXORする。
- その後、64ビットのゼロブロックを繰り返し暗号化し、その出力でP配列およびSボックスのエントリを順に置き換えていく(この操作は合計で521回のBlowfish暗号化を行う)。
このため、鍵を変更するたびにかなりの前処理時間が必要になります(一般に「約4KB分のデータを暗号化するのと同じ時間」と表現されることがあります)。そのため、鍵の頻繁な切り替えが求められる組み込み機器(初期のスマートカードなど)やリソースが極端に限られる環境では向かないことがあります。一方で、この遅い鍵スケジュール特性はパスワードハッシュ関数設計に応用されており、OpenBSD で使われるパスワードハッシュ関数(bcrypt)は、Blowfishの鍵拡張(EksBlowfish)を基にした遅延処理を採用しています。鍵の強化を参照してください。
セキュリティ解析の概況
公開以来、多くの研究者がBlowfishの弱点や縮小ラウンド版への攻撃を調べてきました。代表的な事例を簡潔にまとめます:
- 1996年、Serge VaudenayらはBlowfishに関する理論的解析を行い、既知平文攻撃や特定の弱鍵クラスに関する結果を報告しました。ただし、これらの攻撃は通常、ラウンド数を減らした場合や非常に多くの既知平文を必要とする場合に適用されるものであり、標準の16ラウンドBlowfishを直接破る実用的な手法には至っていません。
- Vincent Rijmenは博士論文で差分攻撃により4ラウンドのBlowfishを破る手法を示しましたが、より多くのラウンドに対しては適用できませんでした。
- ブルートフォース攻撃(鍵探索)を除けば、現在までに16ラウンドのフルBlowfishを完全に破る実用的な攻撃法は公表されていません。
- 実装上の問題としては、公開されているC言語の実装コードの一つに符号拡張に関するバグがあり、1996年に指摘されています。実装時の注意が重要です。
ただし、重要な実用上の制約として、64ビットというブロックサイズは大量データを暗号化する用途では誕生日攻撃(ブロック衝突)のリスクが高まるため、長期間・大量のデータを扱う用途では不利です。現代のプロトコルやストレージ用途では一般に128ビットブロックを持つアルゴリズム(例えばAES)が好まれます。
用途と現在の位置づけ
Blowfishは公開以来広く使われてきましたが、現在は次のような位置づけになっています。
- 既存システムや後方互換のためにまだ利用されることがあるが、新規設計では推奨されない(特に大量データを扱う場合)。
- 鍵スケジュールのコストを利用したパスワードハッシュ関数(bcrypt)の基礎としての価値が高い。OpenBSD のパスワードハッシュ法などにその考え方が応用されている。
- Bruce Schneier自身は発表後により洗練された設計であるTwofish(およびAES)を新しい用途には推奨すると述べています(2007年頃のコメントなど)。
実装上の注意点
実装する際は次を確認してください:
- 鍵長は実装で適切に扱う(32ビット未満の鍵は実用上意味が薄い)。
- 符号拡張やビット演算の扱いに注意し、既知の実装バグを避ける。公開実装を利用する場合は最新版かつ十分にレビューされた実装を選ぶ。
- 大量データの暗号化には64ビットブロックの制約(CBCモードなどでの衝突リスク)を考慮し、必要に応じてより大きなブロックを持つ暗号やAEADモードの使用を検討する。
まとめると、Blowfishはその時代において優れた設計であり、特にソフトウェア実装の高速性と非特許である点が評価されました。一方で、鍵スケジュールの重さや64ビットブロックという制約のため、現代の新規用途ではAESやTwofishなどを選択するのが一般的です。
関連ページ
質問と回答
Q:Blowfishとは何ですか?
A: Blowfishは、1993年にブルース・シュナイアーによって作られた鍵付きの対称型ブロック暗号です。それ以来、多くの暗号化製品に搭載されています。
Q: Blowfishは何のために作られたのですか?
A: Blowfishは、古いDESアルゴリズムに代わる汎用的なアルゴリズムとして、他の暗号化アルゴリズムの問題点や困難さを取り除くために作られました。
Q: Blowfishの鍵長はどのくらいですか?
A: Blowfishの鍵長は0から最大448ビットまで可能です。
Q: Blowfishの設計の特徴は何ですか。
A: 鍵に依存するS-boxや非常に複雑な鍵スケジュールなどの設計上の特徴があります。
Q:全周版Blowfishの暗号解読は知られていますか?
A: 2008年現在、ブルートフォースサーチを除いて、16ラウンドのフルラウンドを解読する方法は知られていません。
Q: Serge Vaudenayは、Blowfishに対してどのような攻撃を発見しましたか?
A: Serge Vaudenayは、28r + 1の既知の平文を必要とする既知の平文攻撃を発見しました(rはラウンドの数)。彼はまた、24r + 1の既知の平文だけでこの同じ攻撃によって検出され、破ることができる弱い鍵のクラスも発見しています。
Q: ブルース・シュナイアー氏は、現在Blowfishの代わりにTwofishを使用することを推奨していますか?
A: はい、DESなどの古いアルゴリズムやAESなどの新しいアルゴリズムと比較して、セキュリティ対策が改善されているため、Bruce Schneierは現在Blowfishの代わりにTwofishを使用することを推奨しています。
百科事典を検索する