ストリーム暗号を正しく理解して使う
ストリーム暗号はキーストリームでバイト単位に暗号化し、高速でパディング不要です。nonce の正しい扱いと、nonce 再利用という致命的な過ちを学びましょう。
- 1
ストリーム暗号は疑似乱数のキーストリームを生成し、平文と XOR します。暗号文の長さは平文とまったく同じで、パディングは不要です。最重要ルール:(キー、nonce) のペアを絶対に再利用しないこと。再利用すると、2 つの暗号文の XOR から 2 つの平文の XOR が露見します。
- 2 RC4 暗号化ツール →
短いメッセージを暗号化して、ストリーム暗号の特性を確認します。暗号文の長さは平文の長さと等しくなります。鍵を変えると出力が完全に変わる様子も観察してください。
- 3 RC4 暗号化ツール →
2 つ目のメッセージを同じ鍵で暗号化して、nonce 再利用の悲劇を実証します。2 つの暗号文を XOR すると、キーストリームが打ち消し合い、2 つの平文の XOR が得られます。構造的な情報が漏れてしまいます。
- 4
現代のストリーム暗号 (ChaCha20、AES-CTR、AES-GCM) は、明示的な nonce を使ってメッセージごとにキーストリームを変化させます。暗号化のたびに新しい nonce を生成してください。ハードコードも再利用も厳禁です。改ざんを検出するには、認証付き暗号 (AEAD) を使ってください。
よくある質問
- nonce の再利用が致命的なのはなぜですか?
- 同じ鍵と nonce で 2 つのメッセージを暗号化すると、C1 XOR C2 = P1 XOR P2 になります。キーストリームが打ち消し合うのです。攻撃者は一方の平文を推測すれば、もう一方を復元できます。これが WPA2 を破った攻撃です (KRACK)。
- ストリーム暗号とブロック暗号はどちらを使うべきですか?
- ほとんどの場合、AES-GCM (AEAD モードのブロック暗号) を使ってください。AES ハードウェアがないデバイスでは ChaCha20-Poly1305 を使います。認証なしの生のストリーム暗号は絶対に使わないでください。