✨ そもそも「共通鍵暗号」って何?
ブロック暗号とストリーム暗号を理解するには、まず「共通鍵暗号(対称暗号)」の概念を知っておく必要があります。
共通鍵暗号とは、暗号化するときと、元に戻す(復号する)ときに同じ鍵を使う暗号方式です。送信者と受信者が同じ鍵を共有します。
ブロック暗号とストリーム暗号は、どちらもこの共通鍵暗号の「サブカテゴリ」です。違いは「データをどう処理するか」にあります。

どっちも同じ鍵を使うなら、何が違うの?

データを「かたまりに分けて処理するか」「流れのまま処理するか」の違いね!引っ越しで例えると、ブロック暗号は荷物を箱に詰めて運ぶ方式、ストリーム暗号はベルトコンベアで流しながら処理する方式だよ🐾
🔸 ブロック暗号とは?
ブロック暗号(Block Cipher)は、データを一定の大きさ(ブロック)に区切って、まとめて暗号化する方式です。
仕組みのイメージ
「データを64個(または128個)ずつ箱に詰めて、その箱ごとに鍵で暗号化する」というイメージです。
- データ全体を固定長のブロックに分割する
- 余った部分は「パディング(詰め物)」で埋める
- ブロックごとに暗号化処理を行う
代表的なブロック暗号
- AES(128ビットブロック):現在の世界標準。Wi-Fi、HTTPS、暗号資産ウォレットに使用。
- DES(64ビットブロック):現在は廃止。AESの前身。
- Twofish(128ビットブロック):AES最終候補5方式のひとつ。Bruce Schneierが設計。
- Blowfish(64ビットブロック):Twofishの前身(1993年設計)。AES選考には参加していないが、bcryptパスワードハッシュの基盤として現在も使用。
- 3DES(64ビットブロック):DESを3回繰り返す延命策。現在は非推奨。
ブロック暗号のメリット・デメリット
✅ メリット
- セキュリティが高い(AESで証明済み)
- ランダムアクセスが可能(中間ブロックだけ復号できる)
- エラーの影響が1ブロックに限定される
- 様々なモードで使い方を変えられる
⚠️ デメリット
- パディングが必要(データ量が増える)
- リアルタイム処理はやや苦手
- 「同じブロックは同じ暗号文」になる問題(モードで解決)
🔸 ストリーム暗号とは?
ストリーム暗号(Stream Cipher)は、データを1ビット(または1バイト)ずつ、流れながら連続的に暗号化する方式です。
仕組みのイメージ
「鍵から長い使い捨て乱数列(キーストリーム)を生成して、データと1ビットずつ混ぜ合わせる」というイメージです。混ぜ合わせにはXOR(排他的論理和)演算を使います。
💡 XOR(排他的論理和)とは?
「2つのビットが異なれば1、同じなら0」というシンプルな演算。重要な性質は「同じ値でXORすると元に戻る」こと。
例:A XOR 鍵 = 暗号文 → 暗号文 XOR 鍵 = A(元に戻る)。これが暗号化と復号を同じ操作でできる理由。
代表的なストリーム暗号
- RC4:かつてSSL/TLSやWEPで使われたが、脆弱性発見により廃止。
- ChaCha20:Googleが採用した現代的ストリーム暗号。TLS 1.3でも使用。セキュリティが高くモバイル端末での処理が速い。
- Salsa20:ChaCha20の前身。セキュリティコンテストで評価が高かった。
ストリーム暗号のメリット・デメリット
✅ メリット
- 高速処理(低スペック機器でも軽い)
- 低遅延(リアルタイム通信に最適)
- パディング不要(データサイズが変わらない)
⚠️ デメリット
- 同じ鍵を再利用すると危険(使い回し禁止)
- エラーが連鎖しやすい
- 乱数生成の品質に安全性が依存

ストリーム暗号って「同じ鍵の使い回し禁止」って怖いね…

これはとても重要ね!同じ鍵を2つの異なる平文に使うと、XORの性質から両方の平文の特徴が漏れてしまうんだよ。実際に第二次世界大戦のソ連の暗号が、鍵の使い回しから解読された歴史があるよ😱
🔸 どちらを選ぶべき?使い分けの基準
| 用途・状況 | おすすめ | 代表的な暗号 |
|---|---|---|
| ファイルやデータの暗号化 | ブロック暗号 | AES |
| Webサイト(HTTPS)の通信 | 両方(状況による) | AES-GCM / ChaCha20 |
| 動画や音声のリアルタイム配信 | ストリーム暗号 | ChaCha20 |
| スマートカード・IoT機器 | ストリーム暗号 or 軽量ブロック暗号 | ChaCha20 / PRESENT |
| 暗号資産ウォレットの保護 | ブロック暗号 | AES-256 |

現代では「どちらかを使わなければならない」というより、AES-GCMというモードがブロック暗号をストリーム暗号のように動かすことができて、両方のいいとこどりをしているね。実際にTLS 1.3(現代のHTTPS)はAES-GCMかChaCha20を使っているよ🐾
📌 まとめ:ブロック暗号 vs ストリーム暗号
ポイントまとめ
📦 ブロック暗号
- データを固定長のブロックに分けて処理
- 高セキュリティ、ランダムアクセス可能
- 代表:AES(現在の世界標準)
- 用途:ファイル暗号化、HTTPS
〜 ストリーム暗号
- データを1ビット/バイトずつ連続処理
- 高速・低遅延、軽量機器に向く
- 代表:ChaCha20(現代の主流)
- 用途:リアルタイム通信、モバイル

「どっちが強い?」ではなく「どっちが向いている?」が暗号の選び方ね。目的と環境に合わせた暗号選びが、本当のセキュリティ知識だよ🐾 STEP 6のまとめ記事もぜひ読んでみてね!