3 認証技術の標準化動向
3.4 署名フォーマット
3.4.1 プリミティブ署名と PKCS#1
プリミティブ署名フォーマットは図 3-23に示すように、X.509証明書や CRLへの署名に使われている署名フォーマットで、被署名データと署名アルゴ リズム及び署名値からなる最もシンプルな形式のものである。以下のASN.1 で定義されている。このような署名形式は署名アルゴリズム以外の一切の属性 を持たないことからX509の署名やPKIプロトコルの署名など特定用途の署名 に用いられるもので、ビジネス目的などの永続的な署名には用いられない。文 書などの永続的な署名には後に述べるCMS署名やXML署名が用いられる。
被署名データ
署名アルゴリズム識別 署名値
図 3‑ 23 プリミティブ署名フォーマット
上記のフォーマットはASN.1では以下のように定義される。
SIGNED { ToBeSigned } ::= SEQUENCE {
toBeSigned ToBeSigned、 --被署名データ
algorithm AlgorithmIdentifier、 --署名アルゴリズム識別子 signature BIT STRING --署名値
}
AlgorithmIdentifier ::= SEQUENCE {
algorithm OBJECT IDENTIFIER、 parameters ANY DEFINED BY algorithm OPTIONAL }
このOBJECT IDENTIFIERで指定される署名アルゴリズムはRSA、DSA、 ECDSAなどがあるが、RSA方式の場合はsha1WithRSAEncriptionや
md5WithRSAEncriptionなどで指定される。署名値は被署名データ
(ToBeSigned )のハッシュ値とパディングをPKCS#1(注)のフォーマット にエンコードしたものに署名鍵で暗号化した値である。RSAの場合、
AlgorithmIdentifierのparametersはNULLとする。(RSAの場合はPublic Key自身にModulus nとparameterであるPublic exponent eを含んでいる からである)。DSAやECDSAではパラメータは陽に指定する。
(注)PKCS#1 [108] のRSA署名フォーマットについて
RSA署名の基本フォーマットはPKCS#1で定められているが、これにはア ドホックなパディングを用いているPKCS#1 v1.5と確率論的に破ることが難 しいということが証明できる方式RSA-PSS(Probabilistic Signature Scheme) 署名フォーマットPKCS#1 v2.1がある。PKCS#1 v1.5のフォーマットはアド ホックなパディングを用いているが致命的な欠陥はいままでに指摘されていな
い。PKCS#1 v1.5はRSA署名フォーマットとして多く使われており、各種の
標準がこれをサポートしている。今後はRSA-PSS署名フォーマットが用いら れるようになろうが、まだ多くの実装がないことから現在の段階では互換性に 問題がある。
日本の電子署名法の省令では特定認証業務で使用するハッシュ関数は
SHA-1のみとし、MD5は今後認めないことになった(1年間の猶予期間をお
く)。またRSA-PSSを新たにオプションで採用することになった。
3.4.1.1 PKCS#1v1.5 のディジタル署名フォーマット RSA暗号は次の二つの目的に使われる。
1. ディジタル署名又は
2. 対称鍵(共通鍵)の配布用(ディジタル・エンベロープ)
この時のディジタル署名値やディジタル・エンベロープのフォーマットとし て使うのがPKCS#1である。ここではディジタル署名のフォーマットを簡単に 説明する。(PKCS#1 v1.5 RFC2313について述べる)
署名対象となるデータ(D)は文書のハッシュ値(メッセージダイジェスト:
MD)である。MDのサイズはハッシュ関数で異なる。
ハッシュ関数:MD5 128ビット(16バイト)
SHA-1 160ビット(20バイト)
ディジタル署名では、このMDをRSAの私有鍵(署名鍵)で暗号化するた めにRSAの鍵長nと同じ長さ(128バイト)に膨らますバッファを次のよう に用意する。ここに1バイトの00の値のセパレータ、1バイトのBT(ブロッ
クタイプ)、105バイトのFFのパッディング、1バイトのセパレータ、そして SHA-1の場合はMD 20バイトが入れられる。
セパレータ
MDの値
SHA-1
20バイト
PS:パッディングストリング
(全てのビットが1)
105バイト
BT:01 ブロック タイプ
1バイト
セパレータ
00 01 FFFFFFFF………FF 00 XXXXXXXXX
図 3‑ 24 ディジタル署名のためのフォーマット
注:ここではBT (ブロックタイプ)を01としているが、00の場合もあり、
その時のパディング部は全てのビットが0となる。しかしこのブロックタイプ は推奨されない。
注:ここでモジュラスnが1024ビットクラス(128バイト=k)の場合に ついて
(nの値は公開値で 2 ^ 1024 <= n < 2 ^ 1027 の範囲の整数である。
nは 2 ^ 1024の固定値でないことに注意)
このようにして出来た128バイトのブロックを128バイトの整数値(x)と みなし、RSAの私有鍵で暗号化したものがディジタル署名となる。すなわち以 下のような指数演算を行う。ここでは秘密の指数(実質的に私有鍵と言って良 い)である。
y = x ^ d mod n
yは暗号化されたデータで128バイトのストリングとみなして署名データと して扱われる。
(このフォーマットは128バイトの入れ物に20バイトのMDが入り、ほと んどがパッディングの埋草になっている。もし、2048ビットの場合は9割以 上が埋草になる。)
ディジタル署名の検証時には署名者の公開鍵で複合化する。すなわち以下の 指数演算を行う。ここでeは公開部分の指数である(eとnが公開鍵とみなさ れる)。
x = y ^ e mod n
復号化したxから元の埋草情報と同じパターンを確認することで、復号が正
しく行われたことが確認できる。
ディジタル署名の検証はもとの文書のダイジェスト(MD’)を計算し、そし て復号化したxからMD部分を取り出しMD’と比較して、一致すれば文書の非 改ざん性を検証したことになる。署名者の検証は別途公開鍵証明書を検証する ことで、公開鍵に対応する私有鍵を所有する署名者の名義が検証できる。