・SHA-256について MD5やSHA-1と同じく認証や署名に使われる一方向性ハッシュ関数の一つで、入力に対し メッセージダイジェストまたはHASH値と呼ばれる256bitの結果を出力する。 一方向性ハッシュ関数の特徴として以下のようなことがある ・HASH(x)からxを逆算することが困難 ・xが与えられたときHASH(x)=HASH(y)となるyを見つけることが困難(弱衝突耐性) ・HASH(x)=HASH(y)となる一組の(x,y)を見つけることが困難(強衝突耐性) MD5の強衝突耐性はすでに破られ,SHA-1もBrute Force Attackよりも効率のよい攻撃方法が 見つかっているため,Cryptrecの電子政府推奨暗号リストではSHA-256以上の使用を推奨して いる。 ・RC4暗号について 共通鍵方式の暗号化アルゴリズムで、RC4と呼ばれる疑似乱数生成アルゴリズムを使用する。 暗号鍵を種としてキーストリームと呼ばれる疑似乱数列を生成し、平文との排他的論理和を 取ることで暗号化を行うストリーム暗号の一つである。 (K:キーストリーム key:暗号鍵 E:暗号文 M:平文 RC4:RC4関数) K=RC4(key) E=M xor K 復号するには暗号化に使用したものと同じキーストリームでxorを取る。 E xor K = (M xor K) xor K = M xor (K xor K)= M xor 0 = M ・RC4暗号のセキュリティーについて 暗号鍵の長さは1〜256byteの範囲で設定できるが、安全性を考えれば16byte(128bit)以上の 長さが推奨される。 ストリーム暗号では2つの平文を同じ鍵で暗号化しないことが強く推奨される。 E1= M1 xor K E2= M2 xor K このような場合で暗号文同士のxorを取った結果は平文同士のxorとなる。 E1 xor E2 = (M1 xor K) xor (M2 xor K) = (M1 xor M2) xor (K xor K) = M1 xor M2 このことで直ちに暗号が解読されるわけではないが、攻撃者にとって有益な情報を与えてしま うことになる。 どうしても同じ鍵を使う必要がある場合はIV(Initialization Vector)を使用する方法がある. 適当なIVを作成し、暗号鍵とIVを結合した値のHASH値を種としてキーストリームを生成する。 例えばIVが"012"で暗号鍵が"abcde"であれば"012abcde"のHASH値を計算する。 HASH関数にはSHAなどを使用する。 seed=HASH(IV || key) (||:結合演算子) K=RC4(seed) E=M xor K このときHASH値を取らずに IV || key から直接キーストリームを生成してはならない。(WEPは これで大きな脆弱性を含むことになってしまった) 送信者は暗号文と一緒にIVを送信し(IVは盗み見されてもかまわない)、受信者は受け取ったIV から同じ方法でキーストリームを生成して復号する。 これによって同じ暗号鍵を使い続けてもIVを毎回変えることで異なるキーストリームを生成する ことができる。(それでも同じ暗号鍵を使い続けると安全性は徐々に落ちていくと考えるべき) IVは乱数でも、0,1,2 と順番でもかまわないが一度使ったIVは二度と使わない必要がある。 ストリーム暗号の性質上、攻撃者は暗号を解読することなく平文に対してxorを使った改竄が できるため、暗号文が改竄されていないかを調べることはとても重要である。 (E':改竄された暗号文 A:改竄データ) 攻撃者による改竄 E' = E xor A 改竄された暗号文を復号 E' xor K = (E xor A) xor K = (E xor K) xor A = M xor A そのため平文のHASH値を一緒に暗号化するなどの必要がある。 HASH値を一緒に暗号化 E= (M || HASH(M)) xor K 復号時に平文のHASH値を計算し、含まれていたHASH値と一致していれば改竄されていないことが わかる。 HASH関数には必ずSHAなど一方向性ハッシュ関数を使い、CRCは使用してはならない。 CRCはxorに対して分配法則が成り立つため全く役に立たない。 ・RSA暗号について 公開鍵方式の暗号化アルゴリズム。 公開鍵方式の鍵には公開鍵と私有鍵が存在し、公開鍵で作成した暗号文は対応する私有鍵でのみ 復号できるため以下の手順で安全に暗号文の送信が行える。 1. 送信者は受信者の公開鍵を何らかの方法で入手しておく。 2. 送信者は受信者の公開鍵で暗号文を作成し送信する 3. 受信者は自分の私有鍵で暗号文を復号する 公開鍵から私有鍵を作成することはきわめて困難なため、私有鍵を秘密にしている限り私有鍵の 所有者以外が暗号文を復号することは出来ない。 ただし、1.の時点で入手した公開鍵が本当に本人のものかを確認しないと、なりすましによる 盗聴を防ぐことが出来ない。 これには信頼できる第三者を介するなどの方法がある。 公開鍵方式の暗号化アルゴリズムは共通鍵方式よりも計算時間が長いため、メインの暗号文は 共通鍵方式で作成し、その鍵を公開鍵方式で暗号化するのが一般的である。 RSAの暗号手順にはいくつか種類があるが、当モジュールではRSA-OAEPを使用している。 ・RSA署名について 偽造・改竄の防止などに使用される電子署名アルゴリズムの一つ。 電子署名で使用する鍵には公開鍵と私有鍵が存在し、私有鍵で作成した署名は対応する公開鍵で のみ検証を通過する特徴があり、以下の手順で署名の作成と検証を行う。 1. 検証者は署名者の公開鍵を何らかの方法で入手しておく。 2. 署名者は署名対象の文と自分の私有鍵から署名を作成する。 3. 検証者は受け取った文と署名、署名者の公開鍵を使用して検証する。 4. 検証を通ればその文は鍵の所有者による署名がされていることが確認できる。 不正な署名であったり、文が改竄されていれば検証を通ることはない。 公開鍵から私有鍵を作成することはきわめて困難なため、私有鍵を秘密にしている限り鍵の所有 者以外が、検証を通過する署名を作成することは出来ない。 ただし、1.の時点で受け取った公開鍵が本当に本人のものかを確認しないと、なりすましを防ぐ ことは出来ない。 実際には署名対象の文そのものではなく、そのHASH値を使用して署名の作成と検証を行うのが 一般的である。 RSA署名は、私有鍵で作成した暗号は対応する公開鍵でのみ復号できるRSAの特徴を利用して電子 署名を実現している。 RSAの署名手順にはいくつか種類があるが、当モジュールではRSA-PSSを使用している。