| -- 目次 -- |
| 1. 前書き |
暗号のことを最初に知ったのは, 1980 年頃, 本屋で買った本 (文献 1) の『新種の暗号』を読んだときが最初です (RSA 暗号を紹介した記事です)。 これは勉強のために 読んだわけではなかったのですが どういうわけだか、その後色々な本で勉強するハメになりました。 最近ではインターネットで検索すると、 暗号に関連したページが随分たくさん出てきますが、 ほぼ大半が英文で書かれています。 そこで 英語を読むのが面倒くさいという人を対象にページを作ってみることにしました。 (但し、少し難しい話になってしまっているかもしれません。 その場合は悪しからず。)
また暗号と言えば、暗号メールの PGP を思い出す人も多いと思います。 これに関してはインストール方法などを別のページで扱っています。
PGP -- 暗号ソフト
| 参考文献 |
| 2. 暗号について, 一般論 |
古典暗号でよく知られているものに次のものがある. アルファベット A, B, C, ... , Z (26 文字) を使用した文章が 与えられたときに
|
のように右に周期的にずらした文字の列を与え, 平文 (もとの文章) の文字 を下の列の文字で置き換える. そうすると例えば
|
YES --> BHV |
のように暗号化される. 読み取る場合には逆の対応を与えることによって 文章を復元する (シーザー暗号, Julius Caesar). この例では
|
S = { A, B, C, ... , Z } |
とおけば, 暗号化することは全単射写像
|
f : S ---> S |
を与えることであり, 解読することは, その逆写像
|
f - 1 : S ---> S |
を与えることである.
暗号化の方法には実は 2 種類の方法があります。
秘密暗号方式では『閉じる鍵』 f と『開ける鍵』 f - 1 が 事実上同じもので、上で与えたシーザー暗号がこれに相当します。 この暗号では『閉じる鍵』も『開ける鍵』も、どちらも絶対に秘密にしないと いけません。また通常は閉じる場合の処理と開ける場合の処理が 本質的に同じになるように工夫されているため、 対称暗号方式(symmetric key cryptography) (あるいは対称暗号, symmetric cipher) などとも呼ばれています。
| 3. DES (Data Encription Standard) -- データ暗号化規格 |
DES は 1970 年代に IBM によって開発された暗号化アルゴリズムで、 1975 年に National Bureau of Standards and Technology (後の National Institute of Standards and Technology = NIST) によって公表され、 1977 年に (国防目的など以外の) 米国連邦政府の標準として採用され、 以後数年おきに再検討されている。 DES は米国の銀行などで広く使われていますが、 現在ではハードウェアー的な方法で解読が可能となったため、 1999 年の再検討に際しては DES を 3 段にした triple DES への移行が推奨されています。 将来的には (21 世紀には) 現在開発途中の AES (= Advanced Encription Standard) が標準となるようです。詳しくは
Cryptographic Module Validation (CMV) Programの中の announcement もしくは Draft FIPS 46-3 (1999 年四月に正式正式採用) を参照してください (後者は Acrobat reader が必要です)。
| DES の仕組み |
DES の規格は FIPS 46-2 あるいは FIPS 46-3 (FIPS = Federal Information Processing Standards Publication) に詳細が記載されていて、上で引用した
Cryptographic Module Validation (CMV) Programの中で読むこともできます。また NIST の
FIPS HOMEで公表されている FIPS 文書を読むことができます。 文書は英文ですが、懇切丁寧な説明があり、 随分わかりやすく書かれています。 しかし、英文を読むのが億劫な人のために 簡単に紹介することにしましょう。
DES の鍵 K は 64 ビットで、そのうち 8 ビットはパリティー検査ビットで、 実質は残りの 56 ビットから構成されている。 DES では以下のようにして、鍵 K を用いて、64 ビットの平文 x が 64 ビット の暗号文 y に変換される。
|
x 0 = IP( x ) = ( L 0 , R 0 ) ( L 0 は左 32 ビット、 R 0 は右 32 ビット) |
|
( L i - 1 , R i - 1 ) ---> ( L i , R i ) = ( R i - 1 , L i - 1 XOR f ( R i - 1 , K i ) ) |
但し、
(1101...) XOR (0111...) = (1010...)
| 解読の方法 |
f の構成法を知らなくても、暗号化 x --->y の逆写像はすぐわかる。 基本的には ( L i , R i ) から ( L i - 1 , R i - 1 ) が決定できればよいだけであるが、
|
となるから明らかである。(mod 2 では 1 = -1 であることに注意。)
| 初期置換 IP |
初期置換 IP は次で与えられる置換である。
|
すなわち、IP によってもとの 58 番目のビットが 1 番目に来て、50 番目のビットが 2 番目に来て、 ... もとの最期のビットが 7 番目のビットとなるわけである。 IP - 1 は次で与えられる。
|
| 関数 f に関して |
長さ 32 のビット列 R と長さ 48 のビット列 K に対して、 f( R, K ) の構成法を説明しよう。 最初に、次の対応で R に対して長さ 48 のビット列 E(R) を生成する。
|
即ち、E(R) の最初の 3 ビットは R の 32 番目、1 番目、 2 番目のビットである。 このあとで、E(R) と K の排他的論理和 E(R) XOR K を考え、これを、長さ 6 の 8 個のビット列 B 1 , B 2 , ... B 8 にわける :
|
E(R) XOR K = B 1 B 2 ... B 8 (右辺は単に横にならべたビット列である) |
更に長さ 6 の各ビット列 B i を長さ 4 のビット列 S i ( B i ) に変換し、 これをならべたものを更に置換 P で変換したものが f ( R, K ) である :
|
f ( R, K ) = P( S 1 ( B 1 ) S 2 ( B 2 ) ... S 8 ( B 8 ) ) |
但し、置換 P は
|
で与えられ、ビット列 S i ( B i ) は次のようにして決める。 S i は成分が 0 から 16 までの整数からなる (4, 16) 行列で、例えば S 1 は次によって与えられる :
|
i = 1 の場合を例に取って、 長さ 4 のビット列 S 1 ( B 1 ) の定め方を説明する。 B 1 は長さ 6 のビット列であるから、最初と最期のビットから、 2 桁の 2 進数が構成でき 0 から 3 までの整数を表す。 B i の中央の 4 個のビットから 4 桁の 2 進数を構成でき 0 から 15 までの 整数を表す。そこでこれらをそれぞれ S 1 の行番号、列番号とみなす。 (但し番号は 0 から始める。) すると S 1 の成分が定まることになり、0 から 15 までの整数、 すなわち長さ 4 のビット列 S 1 (B 1 ) が定まることになるのである。例えば B 1 = 011011 であれば、行番号は 01 (=1), 列番号は 1101 (= 13) となり、 S 1 の (1,13) 成分は 5 (表の赤の文字) であるから
|
S 1 ( B 1 ) = 0101 |
となる。S i (1≦i≦8) に関しては FIPS 46-3 に具体的な形が載っている。
| キー スケジュール (key schedule) |
56 ビットの K から 48 ビットの K 1 , K 2 , ..., K 16 を生成するアルゴリズムをキー スケジュールと呼ぶ。 キー スケジュールにおいては最初にビット列 K に適当な置換選択 (permuted choice) PC-1 をほどこす。置換選択とは、置換と本質的に 同じであるが、この場合には 64 ビットのうち 8, 16, ..., 64 の位置以外のビットを 1 から 56 の位置に動かす。(もともと 8, 16, ..., 64 のビットは各バイトが奇数パリティー になる目的で使用されていた。)
|
PC-1 : { 長さ 64 のビット列 } ---> { 長さ 56 のビット列 } |
更に長さ 56 のビット列を上、下 28 ビットにわけてその各々に 左巡回シフトを適当にほどこしてから置換選択 PC-2 をほどこす。
|
PC-2 : { 長さ 56 のビット列 } ---> { 長さ 48 のビット列 } |
置換選択 PC-1 の具体的な形は
|
上の表の成分に 8, 16, ..., 64 があらわれていないことに注意する。左巡回シフトの回数は
|
この表は第 1 段、第 2 段、第 3 段、...では左巡回シフトをそれぞれ 1 回、1 回、2 回 ... することを意味し、 例えば K 3 を得るためには 1 + 1 + 2 回左巡回シフトする。 置換選択 PC-2 の具体的形は
|
成分は全部で 48 個であるから、1 から 56 までの数が全部出てはいない。
| 3 重 DES (triple DES) |
56 ビットの鍵 K に対しての DES の暗号化、解読をそれぞれ e K , d K であらわす。 3 個の 56 ビットの鍵 K 1 , K 2 , K 3 に対して
|
x ---> e K 3 ( d K 2 ( e K 1 (x) ) ) (x は長さ 64 のビット列) |
が 3 重 DES である。この暗号化ではキーが大きくなるため、 しらみつぶしにキーを探す攻撃に対しては、 DES よりはるかに安全になり、 しかも K 1 = K 2 = K 3 であれば、 既存の DES に一致するため、DES との互換性が保証されることになる。
| DES の使用モード |
長さ 64 のビット列の場合の DES の暗号化の方法を適用することによって、 より長いビット列を暗号化することができるが、それには幾つかのモードがある。 いずれの場合も平文を 64 ビットごとのブロック x 1 , x 2 , x 3 ... に分割し、 暗号分のブロック y 1 , y 2 , y 3 ... を出力する。 以下では y = e K ( x ) は 64 ビットの平文 x の鍵 K による暗号化 y を表す。
| ECB (=electronic codebook) モード |
|
最も簡単なモードで、鍵 K を固定して、各 y i を次で定める
|
| OFB (=output feedback) モード |
|
64 ビットの初期ベクトル V を与え、
によって鍵 (あるいは鍵ストリーム) z 1 , z 2 , ... を生成し、 y i を次で定める。
|
| CFB (=cipher feedback) モード |
|
64 ビットの初期ベクトル V を与え、y i を次で定める。
|
| 他の対称暗号 |
暗号ソフトして有名な PGP で使用することができる対称暗号は 3 重 DES (triple DES) 以外に、 CAST, IDEA がありますが、 それ以外にも簡単に情報が得られるものを 2, 3 挙げると
| CAST |
CAST は NIST の次期の標準 AES (= Advanced Encription Standard) の候補の一つにあげられているものです。 詳しくは
AES Development effortを参照してください。その中の AES Candidate Algorithms に CAST の詳しい説明があります。 (読むためには Acrobat Reader が必要です。) あるいは
The Block Cipher Lounge - AESも参考になります。
| RC2, RC4, RC5, RC6 |
RC2, RC4, RC5, RC6 は Ron Rivest が RSA データ セキューリティー社のためにデザインした ものです。各々仕組みが違うようですが、RC は Rivest's cipher (あるいは Ron's code) の頭文字のようです。RC6 は RC5 の改良版です。 RC5 に関しては RSA データセキューリティー社の FTP サーバー
ftp://ftp.rsa.com/pub/から資料を手に入れることができ、RC6 に関しては
http://www.rsa.com/rsalabs/aes/から資料を手に入れることができます。RC6 も AES の候補の一つです。 上で挙げた
The Block Cipher Lounge - AESも参考になります。
| IDEA (International Data Encription Algorithm) |
IDEA は Ascom 社 (スイス) がパテントを保有していますが、
IDEA Algorithmに簡単な絵の説明があります。また Ascom 社の Free Downloads のページ
Free Downloadsには関連した各種の資料があり、IDEA の C のソースコードまであります。
| 4. 公開鍵 (public key) 暗号 |
冒頭にも説明したように、公開鍵暗号とは暗号化の方式 f から解読の方式 f - 1 を事実上計算することができないような暗号方式のことで、 そのため暗号化の鍵を公開しても支障がないものです。 このような暗号は意識して使用することもありますが、 計算機のパスワードなどの暗号化などユーザが意識せずに使用することもあります。 公開鍵暗号は Diffie-Hellman の方式が始まりですが、 計算機のパスワードの暗号化、インターネットコマースなどで普及するきっかけを あたえたのは RSA です、そこで RSA の解説から始めることにしましょう。 (RSA の名前は開発者 Rivest, Shamir, Adleman の 3 人の頭文字をとって付けたものです。)
| RSA 暗号 |
B が A に秘密の通信を送ることを考える。
| RSA 暗号 |
|
RSA の基礎になっていることは、上の条件の下で、次の写像が互いに逆写像であることである。
|
この証明には, 初等整数論の知識が必要である。f から f - 1 を決定するには s と積 m = pq は公表されているから
によって t が求めるだけでよい, このためには p, q をそれぞれ求める必要があり、 pq の素因子分解が必要となる。 ところが素因子分解は桁数が増えると事実上不可能となるため, 十分大きな桁の素数を選ぶだけで f が一方向関数となるのである。
| RSA 社 と懸賞金 |
RSA の開発者は 1982 年 RSA データ・セキュリティ社を創設し, そのホームページ
RSA Data Securityからは関連する色々な情報を手に入れることができます。とりわけ RSA 研究所の FAQ (RSA Laboratories' Frequently Asked Questions) は随分有益です。またページの下の方の
http://www.rsa.com/html/licensees.htmlなどには、現在 RSA にライセンス料を支払っている企業の名前が 列挙してあり、どれほど浸透しているかを示しています。
RSA の仕組は非常に簡単で, そのためかどうか知りませんが, 1977 年 Rivest, Shamir, Adleman が RSA 暗号を発見した直後に 129 桁の数 (積 pq) と暗号文を公開し, 100 ドルの懸賞金をかけたことが文献 1 に載っています。 賞金はそれに必要とされる労力に比べれば, 非常に微々たるものですが, RSA が非常にセンセーショナルだったため, 米国国防省の介入やら (文献 1 の訳者ノート), 暗号を解くための素因子分解法の改良やら, 既存の数論を暗号論に役立てる試みが世に氾濫することになりました。
1991 年 RSA 社は自社の暗号解読に懸賞金をつけました。 これによって, 暗号解読の技術と理論の発展の最先端レベルを知ることができ, 都合が悪くなれば RSA 暗号の桁を大きくすればよいだけだからです (しかし, 根底から覆る可能性は否定されているわけではありません)。
RSA の研究所の
challengeに説明があり, 懸賞問題は e-mail で送ってくれるそうです。 問題の形式は 100 桁, 110 桁, ... ごとに一個づつの数が与えられ, それぞれ RSA-100, RSA-110,.. と呼ばれています。
| number | month | MIPS-years | algolithm |
|---|---|---|---|
| RSA-100 | April 1991 | 7 | quadratic sieve |
| RSA-110 | April 1992 | 75 | quadratic sieve |
| RSA-120 | June 1993 | 830 | quadratic sieve |
| RSA-129 | April 1994 | 5000 | quadratic sieve |
| RSA-130 | April 1996 | 500 | generalized number field sieve |
| RSA-140 | February 1999 | 2000 | general number field sieve |
とのことです。
| 離散対数問題 -- Diffie-Hellman の鍵交換 |
整数 n, x > 0 が非常に大きい場合でも、任意の b を 固定すれば
の計算は比較的簡単である。しかし、仮に y が 適当な整数 x によって
の形をしていることがわかっても x を求めることは簡単であろうか ? x はいわば b を底とした y の対数
であるから、問題は b を底とした y の対数を求めることが簡単であろうかということになる。 このため、この問題は『離散対数問題』とよばれる。 用語を正確にしておこう:
| 定義 |
|
有限群 G の元 b を固定する。G の元 y が b の累乗のとき、 b を底とした y の離散対数 (discrete logarithm) とは
を満たす (任意の) 整数のことである。
|
特別な場合を除いては一般には離散対数問題は非常に困難であることが経験的に 知られている。いかに述べる Diffie-Hllman の鍵交換は、この離散対数問題の 困難さを利用したものである。 なお Diffie-Hellman では鍵の交換しか できないが、たとえば 3 重 DES などの秘密暗号方式と併用すれば、完全な公開暗号 になる。
| Diffie-Hellman の鍵交換 |
|
素数 p に対して (Z/pZ)× においては離散対数問題が手に負えないものとし、 mod p の原始根 g を固定する ( g の位数がなるべく大きな素数で割りきれれば 十分である )。
|
g a と g b から g ab を決定する問題 を Diffie-Hellman の問題という。第 3 者が秘密の鍵を知ろうとすれば、 Diffie-Hellman の問題を解く必要がある。 Diffie-Hellman の問題と離散対数問題は同等の問題であろうとされているが、 実際に証明されているわけではない。
| ElGamal 暗号 |
Diffie-Hellman の鍵交換を少し修正すれば別の公開鍵暗号ができる。
| ElGamal 暗号 |
|
素数 p に対して (Z/pZ)× においては離散対数問題が手に負えないものとし、 mod p の原始根 g を固定する (g の位数がなるべく大きな素数で割りきれれば 十分である)。 p, g はだれもが知っている数とする。ここで B が A に秘密の手紙を 送ることを考える。
|
次の等式から、ちゃんと解読ができことに注意しよう。
| 楕円曲線暗号 |
ElGamal 暗号は離散対数問題が困難であるすべての群で そのまま実現できる (但し平文を群の要素に対応させなければならない という制約がある)。 このような群としてすぐに思いつくものに
簡単に楕円曲線の解説をしよう。mod p の楕円曲線の話の前に実数体上の 楕円曲線の説明をする方がわかりやすい。楕円曲線 E とは
|
で与えられる 3 次曲線に『無限遠点』と呼ばれる特別な点 O を付けたものである:
|
変数変換をして
|
の形にすることができる (カッコ内の式は重根を持っていない条件である)。 重要な点は E には次のようにして 2 項演算 (加法) を定義できることである。
| 楕円曲線上の 2 項演算 |
|
E 上の 2 点 P = ( x 1 , y 1 ), Q = ( x 2 , y 2 ) に対して
|
2 項演算を図示すると次のようになっている。P, Q を通る直線と E との第 3 の交点の x 軸に対称な 点が R である。
|
以上の演算で楕円曲線がアーベル群となることを確かめることができ (結合法則のチェックだけは非常に面倒)、単位元が O, E 上の点 P = (x, y) の逆元は (x, -y) となる。
mod p の有限体上の楕円曲線は、 整数 a, b に対して
|
のときに y 2 ≡ x 3 + a x + b mod p で定義できると考えてよい。但し 3 次式の処理に際して、 2 や 3 で割る必要があるため素数 p は
|
の条件をつける。 楕円曲線の 2 項演算の定義式が文字式 (有理式) であるため、 実数の場合にアーベル群であることを確かめていれば、mod p の有限体の場合に、 あえて別に確かめる必要はない。
例えば mod 11 の楕円曲線 E : y 2 = x 3 + x + 6 の上の点は次で与えられる。
| x | x 3 + x + 6 mod 11 | 平方数 | y |
|---|---|---|---|
| 0 | 6 | × | |
| 1 | 8 | × | |
| 2 | 5 | 〇 | 4, 7 |
| 3 | 3 | 〇 | 5, 6 |
| 4 | 8 | × | |
| 5 | 4 | 〇 | 2, 9 |
| 6 | 8 | × | |
| 7 | 4 | 〇 | 2, 9 |
| 8 | 9 | 〇 | 3, 8 |
| 9 | 7 | × | |
| 10 | 4 | 〇 | 2, 9 |
従って E 上には (無限遠点を含めて) 全部で 13 個の点があるが、13 は 素数であるから E は巡回群である。
さて楕円曲線による暗号を説明しよう。ElGamal の方法をそのまま適用すると 若干不都合なことがあるが、次のようにすると話が単純になる。
| Menezes-Vanstone の楕円曲線暗号 |
|
p を素数 (>3) とし、簡単のため Fp = Z/pZ とおく。 E を Fp 上定義された (あるいは mod p の) 楕円曲線とする。 E が巡回部分群 H を含み H においては離散対数問題が手に負えないものとする。 H の生成元を g とし、E, p, g はすべて公開されているものとする。ここで B が A に 秘密の手紙を送ることを考える。
|
| 5. デジタル署名 |
デジタル署名は短い文章に署名する方式である。 (長い文章に署名するときには後述するハッシュ関数を使ってメッセージダイジェスト に署名する。) 典型的なものから話をしよう。
| RSA 署名方式 |
今 Alice が
『自分 (Alice) の銀行口座から 100 ドルおろすことを Bob に許可する。』という文書に署名することを考える。RSA 署名方式では RSA 暗号と基本的に 同じことをする。
| RSA 署名方式 |
|
Alice は RSA 公開鍵を用意する :
は誰もが実行できるが、解読
は Alice しかできない。そこで Alice は自分が署名すべき文書 x (0 < x < m) に対して、
によって署名する。 組 (x, y) が署名された文書である。署名の確認は
によって行う。(x から y の計算は Alice しかできなかったことを思い出そう。)
|
| ElGamal 署名方式 |
RSA は公開鍵暗号方式と署名方式のどちらにも用いることができるが、 ElGamal 署名方式は署名専用である。
| ElGamal 署名方式 | |
|
Alice が文書 x に署名するために、ElGamal 暗号方式の公開鍵を用意する :
によって署名する。但し
( x, γ, δ) が署名された文書で、次の式で署名の確認をする。
|
署名の確認をチェックしてみると
|
となり確かによい。
| DSS (Degital Signature Standard -- デジタル署名標準) |
DSS (Degital Signature Standard --- デジタル署名標準) は DES と同様に (国防などの目的以外の) アメリカ連邦政府の標準を決めるものです。 DSS の規格は FIPS PUB 186-1 に詳細が記載されており、NIST の FIPS ホームページ
FIPS HOMEで直接文書を読むことができます。 DSS は 1991 年に最初に提案され、1994 年に標準として採用されています。 これも DES などと同様に数年おきに再検討されており、上で挙げた文書 FIPS PUB 186-1 は再検討後のものです。1991 年に提案された時点では、 デジタル署名標準としては 以下に述べる DSA (= Degital Signature Algorithm) が採択されていましたが、 この決定にはかなり異論があったようで、RSA 社の FTP サーバ
ftp://ftp.rsa.com/pub/で、今だに 1991 年の DSS に対しての RSA 社の抗議文 (NIST.DSS.response ) を読むことができます。 しかし今回の再検討に際しては DSA を使用してもよいし、 RSA を使用してもよい、と書かれています。 1999 年 3 月の時点では日本 RSA のホーム頁
日本 RSAには次のような記事が掲載されていました。
......米国商務省がRSA社のデジタル署名技術を認可し、米国標準 規格(ANSI) X9.31にRSA社のデジタル署名技術を取り入れるための改訂を米国連邦デジタ ル署名標準(FIPS 186-1)に許可した......DSS の選択肢に RSA も入ることになりましたが、 FIPS PUB 186-1 ではもっぱら DSA の説明に本文を使っており、 ここでも簡単に説明を加えることにします (英文を読める人は原文を読む方を勧めます)。
DSA は ElGamal 署名方式の改良版である。 ElGamal 署名方式の問題点は、素数 p が仮に L ビットあれば、 署名が 2 L ビットになる点である。 デジタル署名の適用例にはスマートカードのようなものも 考えられ、署名はなるべく短い方がよい。DSA は ElGamal 署名方式を補整して、 L ビットの素数 p を使って 160 ビットのメッセージに 320 ビットの署名を 付けるものである。
ElGamal 署名方式において、q を p - 1 を割り切る素数とし、g を mod p で位数 q の 元とする。 ElGamal 署名方式の δ の定め方を
|
とすれば署名の確認の式は
|
となる。g, α, γ はすべて g の累乗であるから、位数は q の約数 ( 1 or q ) である。仮に δ が q と互いに素であれば δ は mod q で逆元を持ち、上の式は 次と同値である。
|
g xδ-1, αγδ-1 の 値は xδ-1 mod q, γδ-1 mod q のみにしか依存しない。また式 (*) は g xδ-1 αγδ-1 を p で割った剰余と γ を p で割った剰余が一致していることを意味するから、 γ を mod q で計算しておけば
|
が成立することになる ( mod q は最小の正の剰余の意味で使っている)。 以上が DSS の仕組である。より正確に説明すると
| DSA | |
|
Alice が文書に署名することを考える。
によって署名する。但し
(x, γ, δ) が署名された文書で、署名の確認は次の式でする。
|
| 6. ハッシュ関数 (Hash Function) |
今まで登場したデジタル署名方式では非常に小さな文章にしか署名することが できない。 (DSS の場合であれば 160 ビットのメッセージに 320 ビットの 署名が付けられた。)
一般にはもっと長い文章に署名する必要がある。 例えば 160 ビットごとに分割して、各々に署名してもよさそうに思えるが、 この場合には
| ||||||||||||||||||
| 衝突のないハッシュ関数 |
署名の安全正を低下させないためにはハッシュ関数 h はいくつかの性質を 満たす必要がある。
正当な署名入りの文書 (x, z) が与えられたとしよう (但し y = sig K ( h( x ) ) )。 もしも仮に h( x' ) = h( x ) となる文書 x' を見つけることができれば、 このとき偽造文書
を作成することができる。これはあってはならない。そこで
| 定義 |
|
h をハッシュ関数、x をメッセージとする。
となる文書 x' を見つけることが計算量的に不可能であるときに、
ハッシュ関数 h は文書 x に対して弱い意味で衝突がない
( weakly collision free ) という。
|
仮に相異なる文書 x', x があって、
となることがあれば、文書 x に署名させてしまえば、 偽造文書 ( x', y ) ができあがる。
| 定義 |
|
ハッシュ関数 h に対して
となる相異なる文書 x', x をみつけることが計算量的に不可能であるときに h は
強い意味で衝突がない ( strongly collision free ) と
いう。
|
要するにハッシュ関数は衝突がないように作る必要があるのである。
| SHA (Secure Hash Algorithm) |
ハッシュ関数として有名なものの一つに 1990 年に Rivest によって 発表された MD4 があり、これは翌年 MD5 として強化された。 MD5 は 1996 年に弱点があることが見付かっている。 MD4, MD5 に関しては RSA 社の FTP サーバ ftp://ftp.rsa.com/pub/ に資料があります。
一方 1992 年に同じ原理に基づいて (あるいは MD5 の修正版を)、 NSA (= National Secrurity Agency) は NIST (= Natinal Institute of Standards and Technology) のために標準的なハッシュ関数
安全ハッシュ標準 (SHS = Secure Hash Standard)を公表し、1993 年公式にアメリカ連邦政府の (国防目的以外の) 標準として採用された。 この修正版が 1994 年に公表され、その中のアルゴリズムは
安全ハッシュアルゴリズム (SHA = Secure Hash Algorightm)と呼ばれた。更に 1995 年に修正版 SHA-1 が公表され、これが 現在に至るまでの NIST の推奨する標準となっている。 NIST による SHA-1 の規格を定めた文書 FIPS PUB 180-1 (= Federal Information Standard Publication 180-1) はインターネットの
FIP180-1で読むことができる。(非常に読みやすく書かれている。)
この文書に沿って SHA-1 の概要を説明することにしよう。 SHA-1 は長さが 2 64 より小さなビット列から 160 ビットの メッセージダイジェストを作成するためのハッシュ関数である。 若干の用語と注意が必要となる :
|
SHA-1 では最初に次のようにしてメッセージの長さが 512 の倍数になるようにする。
| Step 1. | もとのメッセージをビット列とみなしたときに直後にビット 1 を付け加え |
| Step 2. | その後ろにビット 0 を幾つか付け加えビット列の長さが 512 の倍数になるようにする。 |
| Step 3. | 但し、最期の 2 ワードには、 もとのメッセージのビット列としての長さ L を 64 ビット整数として 書き込む。 |
実例を挙げて説明する方がわかりやすいであろう :
| 実例 | |||
|
もとのメッセージのビット列が
のとき ( 40 ビット、L = 40 )、Step 1 でこれは
になり、L = 40 を 2 ワードで 16 進表現すると 00000000 00000028 であるから
となる。
|
SHA-1 では 80 個の関数 f 0 , f 1 , ... , f 79 が 使用される。各 f t ( 0 ≦ t ≦ 79 ) は 3 個の 32 ビットワード B, C, D に対して、 一個の 32 ビットワード f t ( B, C, D ) を対応させる。具体的には
|
SHA-1 では 80 個のワード定数 K t ( 0 ≦ t ≦ 79 ) が使用される。 16 進表示では
|
メッセージは先にも述べた方法で長さが 512 の倍数になるように調節し、 これをブロック M 1 , M 2 , ... , M n に分割する (ブロック = 512 ビット = 16 ワード)。 メッセージダイジェストを作成するためには各ブロック M i に 80 ステップからなる処理をほどこす必要があるが、その前に 次のバッファ (一時記憶) が必要となる。
|
処理を開始する前に H 0 , H 1 , H 2 , H 3 , H 4 を次のように初期化する。
|
以上で準備ができた。各ブロック M i を次のように処理をする。
|
| 7. 各種アルゴリズム |
DSS (Digital Signature Standard) を定めている FIPS PUB 186-1 では付録に 各種のアルゴリズムを載せています。 2,3 紹介することにします。
| 素数の確率的判定法 |
DSS の規格を定めた FIPS PUB 186-1 には付録が付いており、 各種のアルゴリズムを紹介しています。 紹介されている確率的素数の判定法は Miller-Rabin の判定法です。 これは例えば
| Miller-Rabin の素数判定法 |
|
Step 1. i = 1, n を 50 以上とする。 Step 2. w を素数判定したい整数とし、w を次のように書く
Step 3. 1 < b < w を満たす乱整数を生成する。 Step 4. j = 0, z = b m mod w とおく。 Step 5. 『 j = 0, z = 1 』 もしくは 『 z = w - 1 』 ならば Step 9 へ Step 6. 『 j > 0, z = 1 』 ならば Step 8 へ
Step 7. j = j + 1 とおく。
Step 8. w は素数でない。アルゴリズムの停止
Step 9. 『 i < n 』 であれば i = i + 1 とおき Step 3 へ。
|
関連して少し紹介すると
| 強擬素数 |
|
w を奇数とし、 w - 1 = 2 s m とおき、 w と互いに素な b ( 0 < b < w ) を選ぶ。 このとき次の 1 もしくは 2 のいずれかが成立して、しかも w が合成数の時、 w を b を底とする強擬素数という。
|
b を色々選んで、w が常に b を底とする強擬素数であれば、w が素数である確率が 高くなるわけです。これが Miller-Rabin の素数判定法の背景です。 証明はかなり難しいのでここでは省略します。
| 疑似乱数 |
線型合同法のような乱数生成器は計算機シミュレーションなどには 有効であっても、暗号理論で使用するための方法ではない (規則性がすぐわかるためである)。
DSS (Digital Signature Standard) を定めている FIPS PUB 186-1 では
SHA (Secure Hash Algorithm)を使用して、各種の乱数を生成する方法を与えている。
| DSA における素数 p, q の生成 |
DSA (Digital Signature Algorithm) では次の条件を満たす任意の素数 p, q を生成しておく必要がある。
具体的なアルゴリズムを述べる前に表記上の注意を述べる。
| { x | 整数、0≦ x<2 h } | <---> | { 長さ h のビット列 } |
| x = x 1 2 h - 1 + x 2 2 h - 2 + ... + x h - 1 2 + x h | <---> | { x 1 , ... , x h } (x i = 0, 1) |
の構成であったことを思い出そう。
| 8. 雑多なことなど |
RSA 研究所の FAQ には e コマースに関してのリンクが紹介されています。 参考までに付け加えておきます。(RSA Laboratories FAQ は RSA 社のホーム頁から手に入れることができます。)