第1回 暗号化の基礎:マスターIT/暗号技術
暗号化技術は、情報の保護やコンピューターセキュリティに欠かせない技術である。今回は暗号化技術の基礎として、暗号化の基本、暗号の安全性、共通鍵暗号と公開鍵暗号について解説。
このマスターIT連載は、IT Pro初心者に向けて、さまざまなITテクノロジを紹介、解説するコーナーである。まずは暗号化について取り上げる。
暗号化技術は、情報の保護やコンピューターセキュリティに欠かせない技術である。ファイルやデータの暗号化の他、HTTPSや、無線LANにおけるWEP/WPA/TKIP/AESのようなセキュアな通信、証明書やデジタル署名、PKIなど、多くの場面で暗号化技術が使われている。今回からしばらくは、暗号化の基礎や共通鍵暗号、公開鍵暗号、証明書、PKIなどについて、IT Proの初心者向けに暗号化技術の基礎を解説していく。今回は、暗号化の基礎を解説する。
暗号化とは
データを保護するだけなら、暗号化ではなく、「ファイルの許可属性(読み出し禁止などの属性)」や「アクセス制御(ACL)」などの方法もある。これらは、アクセスするユーザーに応じてデータへのアクセスを許可したり、禁止したりする技術である。
だがこれらではデータはそのままで、データへのアクセス手段を制限することによって情報を保護している。そのため、特定のユーザーやグループに属していればアクセスできてしまうし、例えばデータが記録されたディスクそのものを入手できれば、その内容に直接アクセスできてしまう(NTFSとしてPCにマウントして読む、など)。
これに対して暗号化は、データそのものを何らかの方法で符号化して、容易には解析できないような形に変換して保存したり、通信したりする技術である。符号化されたデータはそのままでは意味をなさず、暗号を解除する情報(「暗号化の手法」や「鍵」)が分からないと、情報にアクセス(利用)できないようになっている。
たとえ暗号化されたデータが盗難に遭ったり、窃取されてしまっても、暗号化されたデータを解読しない限り、元の内容を知ることはできない。
Windowsにおける暗号化の利用例
暗号化は現在のITにおいては必須の技術である。例えばWindows OSでも次のように、さまざまな場所/機能で暗号化技術が使われている。
機能 | 用途 |
---|---|
ファイル暗号化 | ・ZIPファイル暗号化(パスワード付きZIP) ・暗号化ファイルシステムEFS(NTFS上のファイルを暗号化する技術) |
ドライブ暗号化 | ・BitLockerによるディスク全体の暗号化。暗号化されたディスクは他のシステムにマウントしても内容を読むことができなくなる ・BitLocker To Goによるリムーバブルディスクの暗号化 |
無線LAN | ・WEP/WPA/TKIP/AESなどで通信内容を暗号化して保護する |
メール暗号化 | ・メール本文や添付ファイルなど保護と安全な送受信 |
暗号化通信 | ・HTTPS、SSL、TLS、S/MIME、VPN、IPsec、PPTP、Kerberosなどにおける暗号化通信 |
Active Directoryドメイン | ・PKIや認証局CAの基盤 |
デジタル証明書 | ・PKIの基盤。ユーザーやコンピューター、デバイスなどのオブジェクトを表す証明書 |
デジタル署名 | ・オブジェクトの身元を証明する |
PKI | ・デジタル証明書やデジタル署名を使った証明書基盤 |
デジタル著作権管理 | ・動画の著作権管理(DRM)。権限のあるシステムでしか録画や再生できないようにする |
データベース暗号化 | ・SQL Serverのデータを暗号化して保護する |
Windows OSで使われている暗号化技術の利用例 ファイルやディスク、通信路の暗号化だけでなく、デジタル証明書やデジタル署名などでも暗号化技術は利用されている。 |
このようにさまざまな場面で暗号技術が使われている。ファイルやディスク、通信内容の暗号化はすぐに分かるだろう。その一方で、デジタル署名や証明書、PKIは暗号化とどう関係しているのか、分かりづらいかもしれない。本連載ではそのあたりについても解説していく。
暗号化の基礎
まずは暗号化の話題に登場する基礎的な用語から説明しよう。
暗号化技術とは何かをまとめると次の図のようになる。「暗号化(encryption)」とは、ある「暗号アルゴリズム」に従って、元となる「平文(ひらぶん、plaintext)」データを「鍵(key)」を使って「暗号文(cipher text)」に変換(符号化)することを指す。そして逆に、「暗号文」から鍵を使って「平文」に復元することを「復号(decryption)」という。
また、送信者からが受信者へ送られるデータを通信の途中で窃取することを「盗聴(tapping)」や「傍受(interception)」などと言う。暗号化されていると第三者が入手できるのは暗号文のみとなり、平文が漏えいすることはない。
なお復元用の鍵やアルゴリズムなどの情報なしに、暗号文だけから元の平文を推定することを「解読(cryptanalysis)」などと呼び、正規の受信者が行う復号とは区別するのが一般的である。
暗号化技術とは何か、ということをまとめると次の図のようになる。
暗号化の構成要素
元のデータ(平文)をある規則と鍵情報に基づいて符号化するのが暗号化、これを元に戻すのが復号である。暗号化と復号で利用する鍵は通常は同じものを使う。ただし公開鍵暗号系では異なる鍵を利用する。何らかの方法で暗号文を入手して、鍵情報なしで元の平文を推測・復元することを解読という。
暗号アルゴリズムとは
暗号アルゴリズムとは、入力された平文データをある法則に従って変換し、元のデータを(容易には)推測できない状態に符号化するための方法のことである。鍵データはアルゴリズムに対する入力として利用され、暗号化や復号の際に利用される*1。
*1 平文中の文字を置き換えたり(例:A→D、B→E、……。換字)、並べ替えたり(転置)するだけといった、鍵を使わない単純な暗号もある。しかし一度解読されると二度と使えなくなるので、一般的ではない。
暗号アルゴリズムが漏えいしてもセキュリティ的には問題はない。だが、鍵が漏えいしたり推測されたりすると復号ができてしまうので、鍵データの取り扱いには十分注意する必要がある。
暗号の安全性/強度
暗号化されたデータがどの程度解読されにくいか、ということを暗号の安全性や強度などと呼ぶ。これは暗号化アルゴリズムによって大きく左右される。そこで以下では、安全性/強度という観点で暗号化アルゴリズムを大まかに分類しつつ説明しよう。
■原理的に解読されない方式「ワンタイムパッド」
「ワンタイムパッド(OTP:one-time pad。使い捨てパッドとも)」とは、平文と同じかそれ以上の長さの使い捨て乱数数字列(これを鍵とする)を使った暗号化方式である。平文を暗号化する場合は、乱数列とXOR演算などを施して、これを暗号文とする。乱数列を使い捨てにすることにより、同じ平文であっても二度と同じ暗号文が生成されることはない。
また解読しようとしても、全ての文字組み合わせが現れる可能性があるので、何が元の平文であったかを推定することができない。例えば総当たり攻撃で「こんにちは」や「ありがとう」などが得られたとしても、どちらが正しい元の平文であるかを判断する情報がないので、解読できたとは言えない。
ワンタイムパッドにはこのような特性があるため、暗号理論的には「無条件に安全」とか「情報理論的に安全」と言われる(シャノンの「秘匿システムの通信理論(Communication Theory of Secrecy Systems)」による)。これは、原理的に、鍵情報なしでは解読が不可能という意味である。
だが実用性の面から見ると、これは利用が難しい暗号化方式でもある。というのは、事前に十分な長さの乱数数字列を生成して、安全に配布しておく必要があるからだ。使い捨てではない、疑似乱数列を生成して使ったのでは(乱数の数学的傾向などから)解読される可能性がある。
■ワンタイムパッド以外の暗号化アルゴリズムの安全性
ワンタイムパッド以外の暗号アルゴリズムでは、平文よりも短い鍵データを使って暗号化を行う。すると同じ鍵データを繰り返し使うことになり、暗号文には元の平文の持つ、いくらかの統計的/数学的情報が反映されることになる(完全なランダムデータにならないということ)。その結果、平文の情報がいくらか暗号文中に“漏えい”し、それが解読の手掛かりとなる可能性がある。
そこでワンタイムパッド以外の暗号アルゴリズムでは、その安全性は「計算量的安全性」という基準で評価される。現在の暗号化アルゴリズムはほぼ全てがコンピューター上で実現されているため、暗号を解読するのにどのくらいの「計算量*2」が必要かどうかで暗号の強度を測るのである。
*2 計算量とは、大雑把に言うと、アルゴリズムの実行に必要なCPUの命令ステップ数やメモリ量のことである。
計算量を見積もる場合は、例えば総当たり攻撃ではなく、もっと効率のよい、考え得る最善の方法を想定して解読にかかる計算時間を推定する。そして解読に必要な計算量が現在のコンピューター技術に照らして、現実的な時間内で解読できなければ「計算量的に安全」とする。
どの程度の時間で解読できれば安全な暗号化かという基準ははっきりとは決まっていない。しかし、例えば今の最先端のコンピューターでも推定で1兆年のさらに1兆倍の1兆倍もかかるようならとりあえず安全だろう。
だが時代が進んでコンピューターの性能が飛躍的に向上したり、新しい解読方法が開発されたりして、例えば100年以内で解読できるようになれば、その暗号アルゴリズムやそこで利用されているキー長、ブロック長などは、もう安全とは言えない(100年かかる計算も、1万台で並列処理すれば3日ほどで解けてしまう)。そうなれば、その暗号アルゴリズムはもう“寿命”が尽きていると言える*3。
*3 現実の例で言えば、単純な「DES」や1024bitの「RSA」「SHA-1」(SHA-1は暗号化ではなくハッシュアルゴリズム)などはすでに廃止されることになっている。
このように現代の暗号理論では、安全な暗号とは、未来永劫絶対に解読できないものではなく、実用的な時間やコスト内で解読できなければそれで十分、と考えるようになっている。
共通鍵暗号方式と公開鍵暗号方式
先の図「暗号化の構成要素」では、暗号化と復号の両方で鍵が利用されている。この鍵の使い方によって、暗号化は大きく2つの手法に分けられる。「共通鍵暗号」と「公開鍵暗号」方式である。
これらを簡単にまとめておくと次のようになる(詳細は次回以降で順に解説する)。
■共通鍵暗号
これは暗号化と復号で同じ鍵(つまり1つの鍵のみ)を使う方式である。ドアの鍵や金庫の鍵、ZIPファイルに付ける鍵(パスワード)など、一般的には鍵と言えば、この方式を連想するだろう。暗号化と復号で同じ鍵を使うので「対称鍵暗号」と呼ばれたり、古くから使われているので「慣用暗号」などとも呼ばれる。
共通鍵暗号方式
共通鍵暗号方式では、暗号化と復号で同じ鍵を利用する。そのため、あらかじめ両者の間で鍵情報を共有しておく必要がある。鍵情報が漏えいすると誰でも復号できるようになるので、鍵を安全に配布・保管することは、この暗号の安全性を確保する上で一番重要なことである。
この方式は原理が簡単なので実装しやすいし、広く使われている。しかし鍵をどうやって安全に受信者に届けるか、という点が常に問題になる。これを「鍵配送問題」という。
鍵がなければ復号できない。その一方で正規の受信者以外に鍵情報が漏れてしまうと、誰でも元の復号できることになり、暗号化の意味がなくなってしまう。平文のメールで送っておく、などと言うのは言語道断である。
■公開鍵暗号
これは1970年代に開発された比較的新しい暗号化方式である。その最大の特徴は「暗号化と復号で異なる鍵を使い」、さらに2つある鍵のうちの1つは「公開してもよい」という点にある。暗号化で利用する鍵を公開してもよいというのは非常に画期的な考え方であり、このおかげで、単なるデータの暗号化だけでない、さまざまな用途(証明書や署名、PKIなど)でも利用できるようになった。
公開鍵暗号方式
この方式では、公開鍵と秘密鍵の2つの鍵が利用される(この2つの鍵は完全に独立したものではなく、ある数学的関係などに基づいて決められている)。暗号化通信を利用したいユーザーは、自分自身で公開鍵と秘密鍵を作成し、公開鍵の方を暗号の送信元へ配布しておく。相互に通信したければ、相互に公開鍵を交換する。公開鍵は秘匿する必要はなく、積極的に外部へ配布してよい。データを暗号化したい送信者は、受信者から受け取った公開鍵でデータを暗号化して送信する。受信者は、自分の秘密鍵で受け取った暗号文を復号すればよい(公開鍵で復号することはできない)。
この方式では2つの鍵はそれぞれ「秘密鍵」と「公開鍵」と呼ばれている。そのため公開鍵暗号とか非対称暗号などと呼ばれている。秘密鍵は秘匿しておくべきものだ。一方、公開鍵の方は外部に公開してもよい(実際には、積極的に公開する)。
暗号文を送る場合は、まず送信者が「受信者の公開鍵」を利用して平文を暗号化してから送る。受信側では、自分自身が持つ「受信者の秘密鍵」を使えば復号できる。鍵は必ずペアで使う必要がある。秘密鍵で暗号化したものをまた同じ秘密鍵で復号したり、公開鍵で暗号化したものを同じ公開鍵で復号したりする、といったことはできない。
また各ユーザーは、それぞれが自分自身の鍵ペア(秘密鍵と公開鍵のペア)を持つことになる。双方向で暗号化して送信したければ、お互いに相手の公開鍵を使って暗号化を行ってから送信する。
このような方式は、ドアの鍵や金庫の鍵のようなものからは連想しづらいのでちょっと分かりづらいかもしれない。だが、そのメリットは分かるだろう。暗号文を送る前に、相手に鍵情報を秘密裏に送信する必要がないし、受け取った鍵情報(相手の公開鍵情報)を厳重に保管しておく必要もないのである。公開鍵だから漏えいしても問題ないため、最初に平文のメールで送っておいてもよい。
ブロック暗号とストリーム暗号
暗号化アルゴリズムにはブロック暗号とストリーム暗号という分類もあるので説明しておく。
■ブロック暗号
暗号の対象となる平文データは、通常は1byte単位で可変長である。ただ、1byteの文字を1byteの暗号文に変換していたのでは、すぐに解読されてしまうだろう。入力も出力も256通りしかないので、対応関係を把握するのはたやすいからだ。そこで一般的には、暗号化の効率や安全性などを考慮して、8bytes(64bit)とか32byte(256bit)といった、より大きな「ブロック」ごとにまとめて暗号化する方式が利用されている。これを「ブロック暗号」という。これなら2の64乗通りの入力に対して、2の64乗通りの出力を対応させなければならず、解読が難しくなっている。
■ストリーム暗号
ブロック暗号は処理が簡単である半面、ブロックサイズが小さいと解読されやすいという問題点がある。例えば、以前よく使われていたDESという暗号化方式ではブロックサイズが8bytes(64bit)だった。現在ではコンピューターが進化した結果、非常に脆弱な暗号アルゴリズムとなってしまった。
そこで任意長の鍵ストリーム列を生成させて、これと入力の平文を演算させる「ストリーム暗号」という方式が考え出された。1bitや1byte単位でデータを暗号化できるので、例えばSSL(HTTPS)や無線LAN(WEP)などでも、ネットワークのトラフィックを暗号化するために利用されている。
先ほど述べたワンタイムパッドはストリーム暗号だし、ブロック暗号(DESなど)と組み合わせて鍵ストリームを生成させるストリーム暗号もある。
今回は暗号化の基本的な考え方と、代表的な暗号化アルゴリズムについて見てきた。次回は代表的なブロック暗号であるDESやAESと、DESを基にした暗号化モードなどについて見ていく。
Copyright© Digital Advantage Corp. All Rights Reserved.