コンテンツへスキップ
uencoder

ストリーム暗号を正しく理解して使う

ストリーム暗号はキーストリームでバイト単位に暗号化し、高速でパディング不要です。nonce の正しい扱いと、nonce 再利用という致命的な過ちを学びましょう。

  1. 1

    ストリーム暗号は疑似乱数のキーストリームを生成し、平文と XOR します。暗号文の長さは平文とまったく同じで、パディングは不要です。最重要ルール:(キー、nonce) のペアを絶対に再利用しないこと。再利用すると、2 つの暗号文の XOR から 2 つの平文の XOR が露見します。

  2. 2
    RC4 暗号化ツール →

    短いメッセージを暗号化して、ストリーム暗号の特性を確認します。暗号文の長さは平文の長さと等しくなります。鍵を変えると出力が完全に変わる様子も観察してください。

  3. 3
    RC4 暗号化ツール →

    2 つ目のメッセージを同じ鍵で暗号化して、nonce 再利用の悲劇を実証します。2 つの暗号文を XOR すると、キーストリームが打ち消し合い、2 つの平文の XOR が得られます。構造的な情報が漏れてしまいます。

  4. 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 を使います。認証なしの生のストリーム暗号は絶対に使わないでください。

このタスクを解決するワークフロー

関連ツール