公開鍵暗号
公開鍵暗号（こうかいかぎあんごう、）とは、暗号化と復号に別個の鍵（手順）を用い、暗号化の鍵を公開できるようにした暗号方式である。
暗号は通信の秘匿性を高めるための手段だが、それに必須の鍵もまた情報なので、鍵を受け渡す過程で盗聴されてしまうというリスクがあった。共通鍵を秘匿して受け渡すには（特使が運搬するというような）コストもかかり、一般人が暗号を用いるための障害であった。この問題に対して、暗号化鍵の配送問題を解決したのが公開鍵暗号である。
1960年代、イギリスの政府通信本部 (GCHQ) に所属するが公開鍵暗号（非秘密暗号）を考案し提案は受諾された。しかし理論的には有用性が認められたが、一方向関数が見つけられずこのアイデアは実用化されなかった。1973年、同機関に入所したがこのアイデアに取り組み「作用は可能だが、逆転させられない関数」から素数と素因数分解を基に30分程度で数式を組み立て、さらにが鍵配送問題に解決の糸口を見つけ、今日の"RSA"と呼ばれる暗号システムの基礎を確立した。同時期に、彼らとは無関係な米国のアマチュア数学者、ウィットフィールド・デフィーが独学で公開鍵暗号開発に取り組んでいた。1976年に、ラルフ・マークルの研究の影響を受けたウィットフィールド・デフィーとマーティン・ヘルマンが公開鍵暗号に関する世界最初の論文を発表した。
公開鍵暗号という新規な発明は、本来、エリス＝コックス＝ウィリアムソン組が先であったが、論文にして公表し、その有用性を広く伝えたのは、デフィー＝ヘルマン＝マークル組となったため、本発明の特許権と栄誉は彼らが得た。先に考案していたエリス＝コックス＝ウィリアムソン組は、英軍の管理下であったGCHQが国家機密となっていたために、後発組が公開鍵暗号の論文を発表しても、契約により口外できなかった。後年、公開鍵暗号が広く普及したことで本暗号に関する機密扱いが解除され、エリス＝コックス＝ウィリアムソン組の功績が世に知られることになった。デフィーの「先に開発していたのは本当ですか？」との問いに、エリスは「我々より、君達の方がより多くの事をやっている」と答えている。
公開鍵暗号の概念を実現する具体的な方式は、MITの研究者であったロナルド・リヴェリスト、アディ・シャミル、レオナルド・アデルマンの3人が1977年に開発した。この方式は、開発者各人の頭文字を取って「RSA方式」と呼ばれるようになった。1982年、彼らはカリフォリニア州レッドウッド市にデータセキュリティ専門の会社「RSAデータセキュリティ社」を設立した。
1990年代初頭、フィル・ジマーマンがパーソナル・コンピュータに搭載可能な"PGP"(Pretty Good Privacy)を開発し公開した。このプログラム"PGP"が全世界に普及したことで、誰でも公開鍵暗号が使用できるようになった。
公開鍵暗号は、1980年ごろには「公衆暗号 (public cryptography)」とも呼ばれていた。用語「公衆暗号系 (public cryptosystem)」も使われていたが、DES のような公衆が用いる共通鍵暗号を含むかどうかが紛らわしかったので、これらの用語はすぐに使われなくなった。
1976年以前には、暗号といえば共通鍵暗号であった。これは、暗号化と復号に同じ（共通の）鍵を使うものである。共通鍵暗号には、鍵の配送を極秘に行わねばならないという課題（鍵配送問題）があった。
共通鍵暗号を用いた通信手順の概略
1の過程で、送信者に対してセキュリティの保証されていない通信路を使って鍵を配送すると、傍受者に共通鍵 C を傍受されてしまった場合には、この暗号通信は容易に解読されてしまい意味を持たないことになる。共通鍵暗号方式では鍵の取り扱いが難しい。
共通鍵暗号に生じる鍵配送問題は、送信者と受信者の両者がただ1つ共通の鍵を用いるために起きる問題である。そのため両者が異なる鍵を用いる方法、すなわち公開鍵暗号が考案された。このことが鍵の配送問題を解決した。つまり :暗号化のための鍵と、復号のための鍵を別の（非対称の）ものにすることによって、鍵の配送の問題を解決したのである。
暗号の用語については、暗号理論の用語、暗号の用語を参照。
公開鍵暗号方式には、鍵生成アルゴリズム、暗号化アルゴリズム、復号アルゴリズムの3つのアルゴリズムがある。
鍵生成アルゴリズムは事前準備にあたるアルゴリズムで、（将来暗号文を受け取りたいと思う）全てのユーザは事前に鍵生成アルゴリズムを実行しておく必要がある。ユーザが鍵生成アルゴリズムを実行すると、アルゴリズムはそのユーザの公開鍵および秘密鍵（と呼ばれるデータ）を出力する。公開鍵は暗号文を作成するのに使い、秘密鍵はその暗号文からメッセージを復元するのに使う。
ユーザは鍵生成アルゴリズムを実行する際、セキュリティ・パラメータという値をこのアルゴリズムに入力する。セキュリティ・パラメータは、秘密鍵なしで暗号文の解読がどれだけ困難かの尺度である。
さらに鍵生成アルゴリズムには乱数も入力される。鍵生成アルゴリズムは実行ごとに異なる乱数を選ぶので、ユーザ毎に異なる公開鍵・秘密鍵ペアが割りふられる。
各ユーザは秘密鍵を秘密裏に保管し、公開鍵を皆に公開する。よってユーザの秘密鍵を知っているのはそのユーザ自身だけであるが、それに対しユーザの公開鍵を知っているのは全てのユーザである。
公開鍵、秘密鍵をそれぞれ暗号化鍵、復号鍵ともいう。
暗号文を送るには、送りたいメッセージと、そのメッセージの送信先（受信者）の公開鍵を、入力として暗号化アルゴリズムを実行する（公開鍵は公開情報なので、暗号文の送信者は受信者の公開鍵を手に入れる事ができる）。
それに対し、受信者は復号アルゴリズムに自分の秘密鍵と暗号文を入力して、もとのメッセージを復元する。
復号アルゴリズムでもとのメッセージを復元することを、復号（ふくごう、decryption）と呼ぶ。それに対し、悪意のあるユーザ（攻撃者）が、復号アルゴリズムに（必ずしも）頼らず無理矢理メッセージを復元しようとする試みを解読 (cryptanalysis) と呼ぶ。
公開鍵は公開情報であり、それに対応する秘密鍵は受信者本人しか知らない。よって公開されている公開鍵を使えば誰でも暗号文を作成できるが、それに対しその暗号文を復号できるのは受信者本人のみである。
安全性を確保するには、どの公開鍵がどのユーザのものであるのかという対応をきちんとつけておく必要がある。暗号化の際、受信者の公開鍵を用いていた事を思い出されたい。もし、公開鍵とユーザとの対応が間違っていると、間違ったユーザの公開鍵を使って暗号文を送信してしまう。これを悪用して、前もってあえて間違った対応表を作成することで暗号文を解くという攻撃が可能である（攻撃者はまず、自分の公開鍵をあたかも受信者の公開鍵であるかのように対応表を作る。受信者に当てて暗号文が送られたら、攻撃者はその暗号文を盗聴し、自身の秘密鍵で復号する）。
公開鍵とその持ち主を対応させる方法はいくつか考案されているが、代表的な方法は以下の2つである。公開鍵暗号方式は以下の要件を満たさねばならない。
kをセキュリティ・パラメータとする。formula_1 を、次を満たす平均多項式時間確率アルゴリズム3つ組とする。
formula_1 が後述する正当性を満たすとき、formula_16 は公開鍵暗号方式であるといい、後述する秘匿性をさらに満たすとき、公開鍵暗号方式は安全であるという。
公開鍵暗号方式は2つの要件、正当性と秘匿性とを満たさねばならない。formula_19、formula_20 を攻撃者が指定した2つのメッセージとし、formula_14 を formula_19 もしくはformula_20 を暗号化した暗号文とする。
このとき、攻撃者は formula_14 が formula_19、formula_20 のいずれを暗号化したものであるかを（1/2よりも有意な確率で）知る事はできない。
formula_27, formula_28 を2つのオラクル、formula_29 をビットとする。
暗号に対する攻撃者 formula_30 を用いて次の実験 (Experiment, ゲーム (game) ともいう) をする。
攻撃者 formula_30 のアドバンテージ(advantage)を :formula_38
により定義する。ただしここで formula_53 は次の節で述べる復号オラクルである。
公開鍵暗号方式の場合暗号化用の鍵が公開されているので、攻撃者は（オラクルの助けを借りずとも）任意の平文を暗号化する事ができる。このため、Key Only Attackの事を選択平文攻撃（Chosen Plaintest Attack, CPAと略す）ともいう。
復号オラクル formula_54 は、攻撃者が任意の暗号文 formula_14 を復号オラクルformula_54 に送信すると、formula_57 である限り、formula_58 を使って formula_14 を復号した formula_60 を攻撃者に送り返してくれるオラクルである。（下図参照）
暗号文を知っていることは、平文を知る上で何の役にもたたない。すなわち、暗号文を知っている状況で攻撃者が知ることができる平文についての部分情報は、暗号文を知らなくても攻撃者が知ることができる情報のみである。
formula_65 をセキュリティ・パラメータとし、formula_1 を公開鍵暗号方式とする。formula_67 を多項式時間機械とする。
さらに、formula_68 をオラクルとする。
次の2つのゲームを考える。ただしゲーム中で、formula_69 は多項式時間機械（の動作を記したプログラム）、formula_70 はビット列で、formula_30 の状態と呼ばれる。
任意の多項式時間機械 formula_30 に対し、ある多項式時間機械 formula_86 が存在し、
が "k" に関して無視できるとき、公開鍵暗号方式 formula_1 は formula_42-強秘匿 (Semantic Secure) であるという。formula_30 を攻撃者とし、以下のゲームを考える。
ただし、上のゲームで、formula_112 は、常に同じビット数のメッセージを出力するアルゴリズムでなければならない。
任意の多項式時間機械 formula_30 に対し、
が "k" に関して無視できるとき、公開鍵暗号方式 formula_1 は formula_42-non malleableであるという。公開鍵暗号にはさまざまな方式がある。ここでは典型的な公開鍵暗号方式であるRSA暗号方式を説明する。
この方式の安全性は素因数分解の困難性に基づいている。詳しくは、RSA暗号を参照。
大きな素数 p, q が与えられたとき、その積 n = pq を計算することは容易である。しかし逆に、2つの大きな素数の積であるような自然数 n が与えられたとき、n = pq と素因数分解することは難しい。例えばn=21のときp=7,q=3を求めるのは容易だが、鍵の大きさ（すなわちp, q のビット数）が十分に大きければ、素因数分解にはとてつもない時間が掛かる。
暗号化には n を、復号には p と q を必要とするようなうまい仕組みを作っておく。そして、n を公開鍵として公開する。傍受者は n から p,q を割り出そうとするが、これは時間が掛かりすぎて現実的でない。
もちろん、根気強く分解を試みればいつかは復号に成功するわけである。しかし、一般市民の個人的な通信程度であれば、解読に数年を要する規模の暗号化を施しておけば、それ以上の手間暇を掛けて解読しようとする者はまずいない。これは、事実上秘密が守られていると言える。
軍事用暗号の場合、専用のコンピュータで専門のプログラムを走らせても解読には数億年～数兆年を要するように設計されている。これは、事実上解読不可能と言ってよい。
一般的に、公開鍵暗号は共通鍵暗号よりも暗号化、復号に時間がかかる。そのため、実際の運用では、データの暗号化には「その場限りの共通鍵」を使用し、その共通鍵の配送のみを公開鍵暗号で行う方式がとられることが多い。
また、公開鍵暗号はデジタル署名のために利用されることも多い。署名のような認証機能を提供できることが公開鍵暗号の最大の特長であるとも言える。
公開鍵暗号を初めて実現したのがRSA暗号である。デジタル署名も可能な方式であったことから、RSA暗号は公開鍵暗号として、実際に広く利用されることとなった。
暗号関連