共通鍵暗号または公開鍵暗号とも呼ばれ、メッセージの暗号化と復号化に1つの鍵だけを使用する暗号化方式です。この方法は不正請求や個人情報の盗難を防ぎ、保存されたデータを保護するために、銀行やデータストレージのアプリケーションで一般的に使用されています。
共通鍵暗号とは?
共通鍵暗号は、数学的な関数を用いてメッセージの暗号化と復号化を行います。この暗号化方式は暗号化と復号化の両方に1つの鍵を使用することから「共通」と呼ばれています。対して非対称鍵暗号は、2つの別々の鍵を使ってメッセージの暗号化と復号化を行います。
鍵とは、データをスクランブルしたり、スクランブル解除したりするために特別に作成された2進数のランダムな文字列のことです。鍵の長さとランダム性は、共通暗号化アルゴリズムの強度を決定する要因となります。鍵が長く、予測不可能であればあるほど、攻撃者は鍵を推測して暗号を解読することが難しくなります。
送信者とその指定された受信者は同一の鍵を持ち、その鍵は部外者にメッセージを解読されないように秘密にされています。送信者はこの鍵を使って、暗号法と呼ばれる暗号化アルゴリズムでメッセージを暗号化し、平文を暗号文に変換します。指定された受信者は、同じ鍵を使って暗号文を平文に戻しメッセージを復号します。鍵を持たない人にとっては暗号化されたメッセージは、ランダムな文字、数字、特殊文字の羅列にしか見えません。
共通鍵暗号は暗号化と復号化に同じ鍵を使用する(資料: The SSL Store)
共通鍵暗号はどのように機能するのか?
現代のコンピュータはデータをアルファベットとして保存するのではなく、すべてをビットとして管理しています。入力された文字は、8ビットの組み合わせであるASCIIコードで表現されます。
平文、暗号文、鍵は、コンピュータ上ではすべて2進数で表現されます。このため、暗号法はXOR(排他的論理和)を用いて2進数のメッセージを暗号化・復号化すると便利です。XORは、2つの入力ビットを比較して、1つの出力ビットを生成します。両方の入力のビットが一致する場合は、偽(つまり0)を返し、一致しない場合は真(=1)を返します。
可能な入力と対応する出力を示すXOR真理値表(資料: Instrumentation Tools)
暗号化されたメッセージを送信するためには、ユーザは平文メッセージと共通鍵をXORに入力する必要があります。2つの入力ビットをXORで比較した後、ユーザーは出力ビットとして暗号文を得ることができます。受信者は,暗号化プロセスを逆に行うことで,メッセージを復号化することができます。復号化では、受信者は暗号文と共通鍵をXORの入力として受け取り、元の平文を生成する.
共通暗号の例
例えば、送信者が “Hi “という言葉で構成されたメッセージを送りたいとします。:
- 送信者と受信者は、”01100010 01010000 “という16ビットの共通鍵を共有しています。
- “Hi “という単語で構成されるメッセージは、2進数で “01001000 01101001 “と表されます。
- 両者を比較すると、XOR は「00101010 00111001」という出力を返し、これはテキストに変換すると「*9」に相当します。これが暗号文です。
- 復号化では、暗号文と鍵を比較して平文メッセージを再取得します。
共通鍵暗号のジャンルとは?
共通鍵暗号は、ブロック暗号とストリーム暗号の2つに分類されます。この2つの暗号は、データの暗号化プロセスや動作環境が異なります。
ブロック暗号
平文のメッセージをあらかじめ決められたサイズのビット群(ブロックとも呼ばれる)に分解し、それを暗号化して暗号文にするタイプの暗号です。ブロック暗号は通常、64ビット以上のブロックサイズを暗号化し、56ビット、128ビット、192ビット、256ビットのいずれかの固定長の鍵を使用します。ブロック暗号の代表的な実装としては、以下の2つがあります:
- DES(Data Encryption Standard)は、1970年代初頭に開発された、伝統的な暗号化アルゴリズムと言われています。このブロック暗号は、56ビットの鍵を使用し、64ビットのブロックサイズを暗号化します。鍵の長さが短いため、この暗号規格はあまり安全ではありませんでした。しかしこの暗号規格は、暗号技術の発展に重要な役割を果たしました。DESの開発には米国家安全保障局(NSA)が参加していたため、多くの学者は懐疑的でした。それがきっかけで暗号技術の研究が盛んになり、現在のブロック暗号の理解につながっています。
- AES(Advanced Encryption Standard)はRijndaelとしても知られており、DESに取って代わるものです。AESは、米国政府が機密情報を暗号化するために使用している暗号化規格です。またGoogle、Mozilla、Microsoftなどの企業でも採用されています。ベルギーの暗号技術者であるVincent Rijmen氏とJoan Daemen氏が開発したブロック暗号の一種です。AESはブロックサイズと128、160、192、224、256ビットの暗号鍵サイズを扱うことができます。公式には128ビット、192ビット、256ビットの鍵サイズと128ビットのブロックサイズのみが暗号化規格として規定されています。
ブロック暗号の仕組みの一例として、128ビットの平文と128ビットの鍵を考えてみましょう。ブロック暗号は、平文を8ビットのブロックに分割します。暗号化の際には、ブロックごとに平文と鍵を比較して暗号文を生成します。平文が128ビットに満たない場合、ブロック暗号はパディングと呼ばれる方法でブロックサイズの違いを調整します。パディングとは、暗号化の前に、メッセージの先頭、中間、または末尾にデータを追加する方法です。追加されるデータはパディング方式によって異なり、無意味なフレーズであったり、メッセージを不明瞭にするために使用されたりします。復号後、パディングされたデータは削除されます。
ブロック暗号の例としては、トリプルDES(3DES)、IDEA(International Data Encryption Algorithm)、RC5などがあります。またブロック暗号は、ECB(Electronic Codebook)、CBC(Cipher Block Chaining)、CTR(Counter)などの特定の動作モードによって、ストリーム暗号としても動作します。
ストリーム暗号
ストリーム暗号は、平文のメッセージを1ビットに分解して個別に変換することで、平文を暗号文に少しずつ変換します。この暗号は、キーストリームと呼ばれる疑似乱数ビットの長いストリームに依存しています。キーストリームは、内部のソフトウェアである内部アルゴリズム(またはキーストリームジェネレーター)に、暗号化キーとシードを与えることで生成されます。シードはノンスとも呼ばれ、暗号が一度だけ使用するユニークでランダムに生成された数字です。各メッセージはそれぞれ異なるキーストリームで暗号化・復号化されます。
平文メッセージの暗号化と復号化のために、平文の各桁が対応するキーストリームの桁で一度に1つずつ暗号化され、暗号文の桁が返されます。ストリーム暗号は、各桁の暗号化が暗号の現在の状態に依存することから、状態暗号とも呼ばれます。ストリーム暗号には次の2種類があります:
- 外部同期式ストリーム暗号は、過去の平文や暗号文に頼らず、独立してキーストリームを生成します。
- 自己同期式ストリーム暗号では、前の暗号文の桁数に依存してキーストリームを生成します。
最も広く使われているストリーム暗号はRivest Cipher 4(RC4)で、鍵は64ビットまたは128ビットのサイズです。この暗号はシンプルかつ高速で、大きなデータのストリームを扱うことができます。RC4暗号は、SSL(Secure Socket Layer)、TLS(Transport Layer Security)、WEP(Wireless Equivalent Privacy)などの一般的なウェブプロトコルで使用されています。しかし、RC4には深刻な脆弱性があり、比較的簡単にクラックすることができます。RC4の最大の弱点は、出力の最初のバイトで鍵の情報がわかってしまうという、不十分な鍵スケジュールにあります。この問題を解決するために、RC4A、Spritz、VMPCなどのRC4の応用が開発されています。
共通鍵暗号の利点とは?
共通式暗号は主に2つの利点を持っています:
- セキュリティー: 共通鍵暗号は基本的に破られることがなく、ユーザーはたった1つの鍵を管理する必要があります。実際、米国政府はこの方式で機密情報を暗号化しています。具体的には、前述のAESの実装です。最も安全なAES暗号の鍵長は256ビットです。スーパーコンピュータを駆使しても、総当りで暗号を解読しようとすると、何百万年もかかります。
- スピード: 共通鍵暗号は、比較的短い長さの鍵を1つだけ必要とするというシンプルなものです。その結果、実行速度が格段に速くなります。また、暗号化・復号化の際にサーバーに大きな負荷をかけず、大容量のデータを効率的に扱うことができます。
共通鍵暗号の欠点とは?
しかし、共通鍵暗号方式には2つの重大な弱点があります:
- 鍵の分配: メッセージを暗号化・復号化するためには、送信者と受信者が同一の鍵を共有する必要があるため、送信者は事前に鍵を配布する必要があります。最も安全な方法は、直接会って鍵を配布することです。しかし、直接会うことができない場合は、インターネットを介して鍵を送信することもあります。
- 鍵の管理: 共通鍵暗号では、ある鍵を持っている人はその鍵で暗号化されたメッセージを解読することができます。ソフトウェアベースの攻撃により、攻撃者は保管されている鍵にアクセスし、すべての暗号化されたメッセージを悪用することができます。また、鍵は定期的に紛失するため、暗号化されたメッセージやデータにアクセスできなくなります。
まとめ
共通鍵暗号はサーバーに負担をかけずに大量のデータを暗号化・復号化することができる、比較的安全で高速かつシンプルな暗号化方式です。暗号化と復号化は1つの鍵だけで実現し、鍵を持っている人はその鍵で暗号化されたすべてのメッセージを復号化することができます。しかし、この鍵の配布や管理は難しく、攻撃者が鍵を盗んで暗号を解読する隙を作ってしまう可能性があります。とはいえ、鍵を秘密にしておく限り共通鍵暗号は極めて安全です。そのため、現在でも世界中の企業や政府機関の標準的な暗号化方式として使用されています。