暗号化の基礎:AESとRSAの違い
対称鍵暗号化と非対称鍵暗号化の原理と実際の活用事例を学びます。

デジタル世界の秘密を守る
インターネットバンキングで送金し、メッセンジャーで友人と会話し、ショッピングサイトでカード決済をします。これらすべての瞬間に、私たちの機密情報は世界のどこかのサーバーに送信されています。では、なぜハッカーは途中でこの情報を傍受できないのでしょうか?答えは暗号化にあります。
暗号化とは、読める形のデータ(平文)を読めない形(暗号文)に変換するプロセスです。まるで子供の頃、友達と秘密の手紙をやり取りする際に約束したルールで文字を置き換えていたようなものです。ただし、現代の暗号化は数学的にはるかに複雑で、現存するすべてのコンピュータを動員しても解読できないレベルです。
今日最も広く使用されている2つの暗号化方式があります。AES(対称鍵暗号化)とRSA(非対称鍵暗号化)です。名前は難しそうに聞こえるかもしれませんが、概念を理解すれば、なぜ2つの方式が必要なのか、いつどちらを使用すべきかが明確になります。
対称鍵と非対称鍵:根本的な違い
暗号化の世界で「鍵」は、錠前を開ける鍵のようなものです。対称鍵暗号化では、1つの鍵でロックし、同じ鍵で開けます。家の玄関ドアを思い浮かべてください。1つの鍵でロックして開けることができます。シンプルで速いですが、問題があります。相手に鍵をどうやって安全に渡すかということです。
非対称鍵暗号化はこの問題をエレガントに解決します。2つの鍵を使用し、1つは公開鍵(public key)で誰にでも公開でき、もう1つは秘密鍵(private key)で絶対に公開してはいけません。公開鍵でロックしたものは、秘密鍵でのみ開けることができます。まるで郵便ポストのようです。誰でも手紙を入れることができますが、開けて取り出せるのは鍵を持っている人だけです。
| 特性 | 対称鍵 (AES) | 非対称鍵 (RSA) |
|---|---|---|
| 鍵の数 | 1個 | 2個 (公開鍵/秘密鍵) |
| 速度 | 速い | 遅い (100-1000倍) |
| 鍵配布 | 安全なチャネルが必要 | 公開鍵は公開可能 |
| 主な用途 | 大容量データの暗号化 | 鍵交換、デジタル署名 |
AES:高速で強力な対称鍵暗号化
AES(Advanced Encryption Standard)は、2001年に米国政府が採用した標準暗号化アルゴリズムです。以前使用されていたDESがコンピュータ性能の向上により安全ではなくなったため、世界中の暗号学者の競争を経て選定されました。ベルギーの暗号学者が作成したRijndaelアルゴリズムがその主役です。
AESの強みは速度です。現代のプロセッサはAES演算用の専用命令(AES-NI)を内蔵しており、ギガバイト単位のデータも瞬時に暗号化できます。パスワードでファイルを暗号化したり、データベースの機密情報を保護したり、ディスク全体を暗号化する際にAESが使用されます。
鍵の長さによってAES-128、AES-192、AES-256に分かれます。数字は鍵のビット数を意味します。AES-256は2^256通りの可能な鍵の組み合わせがあり、これは宇宙に存在する原子の数よりも多いです。現在の技術では総当たり攻撃(brute force)で破ることは不可能です。
しかし、AESを使用する際に1つの重要な決定があります。それは運用モードの選択です。ECBモードは同じ平文ブロックが常に同じ暗号文を生成するため、パターンが露出する可能性があり、絶対に使用してはいけません。現在推奨されているのはGCM(Galois/Counter Mode)です。GCMは暗号化と共にデータの整合性も検証するため、暗号文が改ざんされたかどうかも確認できます。
const crypto = require('crypto');
function encrypt(text, key) {
const iv = crypto.randomBytes(12); // GCMは12バイトのIVを推奨
const cipher = crypto.createCipheriv('aes-256-gcm', key, iv);
let encrypted = cipher.update(text, 'utf8', 'hex');
encrypted += cipher.final('hex');
const authTag = cipher.getAuthTag();
return {
iv: iv.toString('hex'),
encrypted,
authTag: authTag.toString('hex')
};
}
RSA:公開鍵暗号化の代名詞
RSAは1977年にMITの3人の教授、Rivest、Shamir、Adlemanの名前の頭文字を取ったアルゴリズムです。大きな数の素因数分解が難しいという数学的原理に基づいています。2つの大きな素数を掛け合わせることは簡単ですが、その結果から元の2つの素数を見つけ出すことは天文学的に困難です。
RSAの最大の利点は、鍵配布問題を解決することです。公開鍵は文字通り公開しても構いません。誰かがあなたに暗号化されたメッセージを送りたい場合、あなたの公開鍵で暗号化して送ればよいのです。あなただけが持っている秘密鍵でしか開けられないからです。
RSAはデジタル署名にも使用されます。この場合は逆に秘密鍵で署名し、公開鍵で検証します。秘密鍵は本人だけが持っているため、有効な署名があるということは、そのメッセージが本当にその人から来たという証拠になります。ソフトウェアアップデートパッケージや法的文書の真正性を確認するために使用されます。
ただし、RSAは遅いです。AESより数百から数千倍遅いため、大容量データを直接暗号化するには適していません。そのため、実際にはハイブリッド方式を使用します。
ハイブリッド暗号化:2つの世界の利点を1つに
現実世界のほとんどの暗号化システムは、AESとRSAを一緒に使用します。HTTPSでウェブサイトにアクセスする際に起こることを簡略化すると次のようになります。
まず、ブラウザがサーバーに接続すると、サーバーは自分の公開鍵が含まれた証明書を送ります。ブラウザはランダムなAES鍵(セッション鍵)を生成し、これをサーバーのRSA公開鍵で暗号化して送ります。サーバーは自分の秘密鍵でこれを復号してAES鍵を取得します。これで両者とも同じAES鍵を持つことになり、以降のすべての通信はこの高速なAESで暗号化されます。
この方式の美しさは、RSAの鍵配布の利点とAESの速度の両方を取り入れていることです。RSAは小さなデータ(AES鍵)のみを暗号化するので遅さが問題にならず、実際の大容量通信は高速なAESが担当します。
暗号化実装時の注意事項
暗号化アルゴリズム自体は強力ですが、誤った使い方をすると無意味になります。いくつかのよくある間違いを避ける必要があります。
鍵をソースコードにハードコーディングしてはいけません。GitHubにアップロードされたコードからAWSキーが露出してハッキングされたというニュースをよく見かけます。鍵は環境変数やAWS KMS、HashiCorp Vaultなどの専門的な鍵管理サービスを使用すべきです。
AESのIV(初期化ベクトル)は毎回新しいランダム値を使用する必要があります。同じ鍵で同じIVを再利用すると暗号化が破られる可能性があります。IVは秘密ではないため、暗号文と一緒に保存しても構いません。重要なのは再利用しないことです。
独自に暗号化アルゴリズムを実装しようとしないでください。検証済みのライブラリを使用する方がはるかに安全です。暗号学は微妙な間違い1つが全体のセキュリティを崩壊させる可能性がある分野です。
まとめ
暗号化は現代のデジタル世界の基盤です。AESとRSA、この2つのアルゴリズムの原理を理解すれば、HTTPSがどのように機能するのか、パスワードをなぜハッシュで保存すべきなのか、電子署名とは何かが自然と理解できるようになります。
Toolypetの暗号化ツールを使って、実際にテキストを暗号化・復号してみてください。抽象的に感じていた概念が具体的な経験に変わる瞬間、セキュリティへの理解が一段階深まることでしょう。