公開鍵暗号とディジタル署名
インターネット上の公開鍵暗号やディジタル署名に関する解説で,以下のような記述が時々見られます.
・公開鍵で暗号化したものは秘密鍵で復号でき,秘密鍵で暗号化したものは公開鍵で復号できる.
・公開鍵暗号方式による署名は,メッセージ(ダイジェスト)を秘密鍵で暗号化することで実現できる.
「秘密鍵で暗号化」と言うのは,公開鍵を持つ誰でもが復号できるという意味でそもそも「暗号化」とは言い難く矛盾があると言えます (データを隠蔽する意味での暗号化ではない).
これらの誤った記述に起因する疑問や質問もインターネット上の質問サイトにしばしば投稿されています.これらの記述は RSA暗号アルゴリズムを前提にしており誤りなのですが,ここではこれらの誤解の背景と正しい理解のための情報を整理します.
ディジタル署名に関する誤解の背景
-
RSA暗号の秘密鍵と公開鍵の対称性を利用して鍵を逆に使うという,ディジタル署名(RSA署名)が提案されたため,署名の生成が秘密鍵による暗号化と解釈されることが広まった(署名は秘密鍵による復号演算を利用したものと解釈すべき).
-
ディジタル署名には様々なアルゴリズムがあります.DSA署名など他のディジタル署名のアルゴリズムは,署名の生成・検証専用でそもそも暗号化・復号の機能はありません.しかし,ディジタル署名としてこれらのアルゴリズムが一般的に解説されることは少なく,RSA署名を前提とした解説がなされてきた.
- 古くからある暗号ライブラリの OpenSSL では,RSA署名のための低レベル関数として,RSA_private_encrypt, RSA_public_decrypt があります.関数 RSA_sign は
RSA_private_encrypt を呼び出しています.誤解を与える関数名が使われてきた.
-
ディジタル署名の正式な仕様書や暗号の専門書には正しい記述があります(「秘密鍵で暗号化」などという記述は無い).これらを読む機会のない人がインターネット上の記事から不正確な理解をして新たな発信により誤解が拡大再生産されてきた.
ディジタル署名と公開鍵暗号の関係
現在,単に公開鍵暗号方式と言った場合,広義の意味では秘密鍵と公開鍵のペアを用いた方式 (Public Key Cryptography) であり,暗号化・復号,ディジタル署名,鍵交換などが実現できる方式を指します.
狭義の意味では秘密鍵と公開鍵を用いたデータの暗号化方式 (Public Key Encryption) で共通鍵暗号方式に対比される方式です(暗号化・復号機能のみを対象).
IPA の電子政府推奨暗号リスト(CRYPTREC)では,公開鍵暗号/守秘,公開鍵暗号/署名,公開鍵暗号/鍵共有という分類になっています.
ディジタル署名は,「広義の公開鍵暗号の一種」ですが,「狭義の公開鍵暗号を元にした方式」ではないと言えます(暗号化・復号機能を前提とはしていない).
ディジタル署名とは
- ディジタル署名の機能
ディジタル署名と暗号化・復号は,全く異なる機能です.
ディジタル署名は送信者が文書に対する署名を秘密鍵で生成し文書とともに受信者に送信し,受信者は送信者の公開鍵で文書と署名から署名の正当性を検証する仕組みです.
ディジタル署名は文書が改ざんされていないことと,署名が送信者によって生成されていることを確認するためのものです.
ディジタル署名の本質は,「(秘密鍵を持つ)本人のみが署名を作れること,(秘密鍵と対になる公開鍵を使って誰でも)署名データの妥当性を検証できること」です.ここに,暗号化・復号の概念は含まれません.
実生活上のイメージは,実印と印鑑証明書の関係が近いでしょう.
- 書類に実印を押す.(実印は本人しか持ちえない秘密鍵相当)
- 実印に対する印鑑証明書(公開鍵相当)を公的機関から取得して,実印を押した書類とともに提示する.(印鑑証明書は公開鍵と違い本人しか取得できませんが)
- 書類上の実印の印影を印鑑証明書と比較して一致しているか否かで検証する.
実印による押印と一緒に印鑑証明書があることで「確かに本人が実印を使って押した書類」であることが認められます.
- 署名方式の分類
ディジタル署名は以下のような方式で実現できます.
公開鍵を用いた関数 $ψ_P$ と秘密鍵を用いた関数 $ψ_S$ の組に対し,それぞれ以下の式が成立つことにより署名の検証を行います.$r$ は乱数であり,メッセージ (またはダイジェスト) $m$ と鍵が同じでも署名が毎回異なるよにするために使われます.
- 署名方式
$ψ_P(m, ψ_S(m)) = 1$
- 確率的署名方式
$ψ_P(m, ψ_S(r, m)) = 1$
- メッセージ復元署名方式
$ψ_P(ψ_S(m)) = m$
- 確率的メッセージ復元署名方式
$ψ_P(ψ_S(r, m)) = m$
ディジタル署名は上記のような関数 $ψ_P$ と $ψ_S$ が存在すれば実現でき,RSA暗号の関数もそのような関数の1つです(メッセージ復元署名).
- ディジタル署名アルゴリズム
ディジタル署名アルゴリズムは,アルゴリズム識別子(Algorithm Identifier)と言う識別子を用いて国際的に一元管理されています.
アルゴリズム識別子には,次のようなものがあります(実際の識別子 OID は,7個の数字の組です).
・SHA256withRSA,SHA256withDSA,SHA512withECDSA,...
このように,署名アルゴリズムとハッシュ関数の組み合わせで表します.
RSA署名(ディジタル署名としてのRSA暗号)
実用的に使われている(標準化された) RSA暗号や RSA署名は,暗号の教科書やインターネット上の解説記事にある対象メッセージの単純なべき乗剰余演算ではありません.RSA の標準規格を定めた PKCS#1 では,次のような違いがあります.
- 署名生成・検証プリミティブ
署名や暗号に使われる基本演算はプリミティブと言われます.
- 署名プリミティブ(RSASP1) は秘密鍵を用いてメッセージから署名を生成し,検証プリミティブ(RSAVP1) は対応する公開鍵を用いて署名からメッセージを回復する.
- RSASP1 と RSAVP1 は,RSADP (復号プリミティブ) と RSAEP (暗号プリミティブ) とそれらの入力と出力の名前を除いて同じである.
RSA署名では,署名生成は復号と同等の処理を行い,検証の際は暗号化と同等の処理を行います.
これらのプリミティブはそのまま使われるのではなく,署名スキームや暗号スキームのベースとして使われます.
- 秘密鍵の構成
秘密鍵は,$(n, d)$ または $(p, q, dP, dQ,dInv)$
のいずれかの形式です.第2の形式は演算の高速化を図るためのもので(中国人の剰余定理の利用),通常はこちらが用いられます.この場合,秘密鍵と公開鍵は形式的にも異なることになります.
- 署名スキーム
署名生成・検証プリミティブを単純に用いただけでは,安全性(セキュリティ)に問題があるため,入力メッセージ $m$ を乱数やハッシュ関数を用いてエンコードした $em$ が演算対象になります.代表的なエンコード方式(署名スキーム) に,RSASSA-PSS があります.また,暗号スキームにも RSAES-OAEP というエンコード方式が使われます.したがって,暗号と署名では,同じプリミティブが使われてもスキームレベルでは異なる処理になります.