メインコンテンツまでスキップ

RFC 8017 - PKCS #1: RSA暗号仕様バージョン2.2

  • ステータス: Informational
  • 発行日: November 2016
  • ストリーム: IETF
  • 廃止: RFC3447
  • エラッタ: エラッタなし

概要 (Abstract)​

本文書は、RSAアルゴリズムに基づく公開鍵暗号の実装に関する推奨事項を提供し、暗号プリミティブ (Cryptographic Primitives)、暗号化スキーム (Encryption Schemes)、付録付き署名スキーム (Signature Schemes with Appendix)、および鍵を表現しスキームを識別するためのASN.1構文をカバーしています。

本文書は、RSA Laboratoriesの公開鍵暗号標準 (PKCS) シリーズのPKCS #1 v2.2の再発行を表します。このRFCの発行により、変更管理権限がIETFに移管されます。

本文書はRFC 3447も廃止します。


本文書のステータス (Status of This Memo)​

本文書はインターネット標準トラックの仕様ではなく、情報提供の目的で発行されています。

本文書はインターネット技術タスクフォース (IETF) の成果物です。これはIETFコミュニティの合意を表しています。公開レビューを受け、インターネット技術運営グループ (IESG) によって発行が承認されました。IESGによって承認されたすべての文書が、あらゆるレベルのインターネット標準の候補であるわけではありません。RFC 7841のセクション2を参照してください。

本文書の現在のステータス、正誤表、およびフィードバックの提供方法に関する情報は、http://www.rfc-editor.org/info/rfc8017 で入手できます。


目次 (Contents)​

付録 (Appendices)​


関連リソース​


1. Introduction (序論)​

本文書は、RSAアルゴリズム (RSA Algorithm) [RSA] に基づく公開鍵暗号 (Public-Key Cryptography) の実装に関する推奨事項を提供し、以下の側面をカバーしています:

  • 暗号プリミティブ (Cryptographic Primitives)
  • 暗号化スキーム (Encryption Schemes)
  • 付録付き署名スキーム (Signature Schemes with Appendix)
  • 鍵を表現しスキームを識別するためのASN.1構文

これらの推奨事項は、コンピュータおよび通信システムにおける一般的な適用を目的としているため、かなりの柔軟性を含んでいます。これらの仕様に基づくアプリケーション標準には、追加の制約が含まれる場合があります。これらの推奨事項は、IEEE 1363 [IEEE1363]、IEEE 1363a [IEEE1363A]、およびANSI X9.44 [ANSIX944] 標準と互換性があることを意図しています。

本文書は、PKCS #1バージョン2.1 [RFC3447] に取って代わりますが、互換性のある技術を含んでいます。

本文書の構成は以下の通りです:

  • セクション1は序論です。

  • セクション2は、本文書で使用される表記法を定義します。

  • セクション3は、RSA公開鍵 (RSA Public Key) とRSA秘密鍵 (RSA Private Key) の型を定義します。

  • セクション4と5は、いくつかのプリミティブ (Primitives)、つまり基本的な数学演算を定義します。データ変換プリミティブ (Data Conversion Primitives) はセクション4に、暗号プリミティブ(暗号化・復号化および署名・検証)はセクション5にあります。

  • セクション6、7、8は、本文書の暗号化スキームと署名スキームを扱います。セクション6は概要を提供します。PKCS #1 v1.5にある方法に加えて、セクション7は最適非対称暗号化パディング (Optimal Asymmetric Encryption Padding, OAEP) [OAEP] に基づく暗号化スキームを定義し、セクション8は確率的署名スキーム (Probabilistic Signature Scheme, PSS) [RSARABIN] [PSS] に基づく付録付き署名スキームを定義します。

  • セクション9は、セクション8の署名スキームのエンコード方法 (Encoding Methods) を定義します。

  • 付録Aは、セクション3で定義された鍵およびセクション7と8のスキームのASN.1構文を定義します。

  • 付録Bは、本文書で使用されるハッシュ関数 (Hash Functions) とマスク生成関数 (Mask Generation Function, MGF) を定義し、これらの技術のASN.1構文を含みます。

  • 付録Cは、ASN.1モジュールを提供します。

  • 付録DとEは、PKCS #1の改訂履歴の概要を示し、公開鍵暗号標準 (Public-Key Cryptography Standards) に関する一般的な情報を提供します。

本文書は、RSA Laboratoriesの公開鍵暗号標準 (PKCS) シリーズからPKCS #1 v2.2 [PKCS1_22] の再発行を表しています。

1.1. Requirements Language (要件言語)​

本文書におけるキーワード「MUST」(しなければならない)、「MUST NOT」(してはならない)、「REQUIRED」(必須である)、「SHALL」(しなければならない)、「SHALL NOT」(してはならない)、「SHOULD」(すべきである)、「SHOULD NOT」(すべきでない)、「RECOMMENDED」(推奨される)、「MAY」(してもよい)、および「OPTIONAL」(任意である)は、[RFC2119] に記載されているとおりに解釈されるものとします (SHALL)。


2. Notation (表記法)​

本文書における表記法 (Notation) には以下が含まれます:

記号説明
c暗号文代表値 (Ciphertext Representative)、0とn-1の間の整数
C暗号文 (Ciphertext)、オクテット文字列 (Octet String)
dRSA秘密指数 (RSA Private Exponent)
d_i追加因子r_iのCRT指数 (Additional Factor r_i's CRT Exponent)、e * d_i == 1 (mod (r_i-1)), i = 3, ..., uを満たす正の整数
dPpのCRT指数、e * dP == 1 (mod (p-1))を満たす正の整数
dQqのCRT指数、e * dQ == 1 (mod (q-1))を満たす正の整数
eRSA公開指数 (RSA Public Exponent)
EMエンコードされたメッセージ (Encoded Message)、オクテット文字列
emBitsエンコードされたメッセージEMの(意図された)ビット長
emLenエンコードされたメッセージEMの(意図された)オクテット長
GCD(. , .)2つの非負整数の最大公約数 (Greatest Common Divisor)
Hashハッシュ関数 (Hash Function)
hLenハッシュ関数Hashの出力長(オクテット単位)
kRSA剰余nの長さ(オクテット単位)
KRSA秘密鍵 (RSA Private Key)
LオプションのRSAES-OAEPラベル (Label)、オクテット文字列
LCM(., ..., .)非負整数リストの最小公倍数 (Least Common Multiple)
mメッセージ代表値 (Message Representative)、0とn-1の間の整数
Mメッセージ (Message)、オクテット文字列
maskMGF出力、オクテット文字列
maskLenオクテット文字列maskの(意図された)長さ
MGFマスク生成関数 (Mask Generation Function)
mgfSeedマスクが生成されるシード (Seed)、オクテット文字列
mLenメッセージMの長さ(オクテット単位)
nRSA剰余 (RSA Modulus)、n = r_1 * r_2 * ... * r_u、u >= 2
(n, e)RSA公開鍵 (RSA Public Key)
p, qRSA剰余nの最初の2つの素因数 (Prime Factors)
qInvCRT係数 (CRT Coefficient)、q * qInv == 1 (mod p)を満たすp未満の正の整数
r_iRSA剰余nの素因数、r_1 = p、r_2 = qおよび追加の因数(もしあれば)を含む
s署名代表値 (Signature Representative)、0とn-1の間の整数
S署名 (Signature)、オクテット文字列
sLenEMSA-PSSソルト (Salt) の長さ(オクテット単位)
t_i追加素因数r_iのCRT係数、r_1 * r_2 * ... * r_(i-1) * t_i == 1 (mod r_i)、i = 3, ..., uを満たすr_i未満の正の整数
uRSA剰余の素因数の数、u >= 2
x非負整数
Xxに対応するオクテット文字列
xLenオクテット文字列Xの(意図された)長さ
0xオクテットまたはオクテット文字列の16進表現指示子:「0x48」は16進値48のオクテットを示す;「(0x)48 09 0e」は16進値48、09、0eの3つの連続したオクテットの文字列を示す
λ(n)LCM(r_1-1, r_2-1, ..., r_u-1)
⊕2つのオクテット文字列のビット単位排他的論理和 (Bit-wise Exclusive-OR)
⌈.⌉天井関数 (Ceiling Function);⌈x⌉は実数x以上の最小の整数
||連結演算子 (Concatenation Operator)
==合同記号 (Congruence Symbol);a == b (mod n)は整数nが整数(a - b)を割り切ることを意味する

注意:中国剰余定理 (Chinese Remainder Theorem, CRT) は非再帰的および再帰的な方法で適用できます。本文書では、Garnerのアルゴリズム [GARNER] に従った再帰的アプローチを使用します。セクション3.2の注記1も参照してください。


3. Key Types (鍵の型)​

本文書で定義されているプリミティブとスキームでは、2つの鍵の型が使用されます:RSA公開鍵 (RSA Public Key) とRSA秘密鍵 (RSA Private Key)。RSA公開鍵とRSA秘密鍵を合わせて、RSA鍵ペア (RSA Key Pair) を構成します。

本仕様は、いわゆる「マルチプライム」(Multi-prime) RSAをサポートしています。これは、剰余が2つ以上の素因数を持つことができるものです。マルチプライムRSAの利点は、中国剰余定理 (Chinese Remainder Theorem, CRT) を使用する場合、復号化および署名プリミティブの計算コストが低くなることです。シングルプロセッサプラットフォームでもより良いパフォーマンスを達成できますが、マルチプロセッサプラットフォームではさらに大きな改善が得られます。これは、関連するモジュラー指数演算を並列で実行できるためです。

マルチプライムがRSA暗号系のセキュリティにどのように影響するかについての議論は、[SILVERMAN] を参照してください。

3.1. RSA Public Key (RSA公開鍵)​

本文書の目的上、RSA公開鍵は2つのコンポーネントで構成されます:

n        RSA剰余 (RSA Modulus)、正の整数
e RSA公開指数 (RSA Public Exponent)、正の整数

有効なRSA公開鍵では、RSA剰余nはu個の異なる奇素数r_i(i = 1, 2, ..., u、ただしu >= 2)の積であり、RSA公開指数eは3とn - 1の間の整数で、GCD(e, λ(n)) = 1を満たします。ここで、λ(n) = LCM(r_1 - 1, ..., r_u - 1)です。慣例により、最初の2つの素数r_1とr_2は、それぞれpとqとして表すこともできます。

実装間でRSA公開鍵を交換するための推奨構文は、付録A.1.1に示されています。実装の内部表現は異なる場合があります。

3.2. RSA Private Key (RSA秘密鍵)​

本文書の目的上、RSA秘密鍵は2つの表現のいずれかを持つことができます。

表現形式1​

最初の表現形式は、ペア (n, d) で構成され、コンポーネントには次の意味があります:

n       RSA剰余 (RSA Modulus)、正の整数
d RSA秘密指数 (RSA Private Exponent)、正の整数

表現形式2​

2番目の表現形式は、五つ組 (p, q, dP, dQ, qInv) と、(空の可能性がある)三つ組のシーケンス (r_i, d_i, t_i)(i = 3, ..., u、五つ組に含まれていない各素数に対して1つ)で構成され、コンポーネントには次の意味があります:

p      最初の因数、正の整数
q 2番目の因数、正の整数
dP 最初の因数のCRT指数、正の整数
dQ 2番目の因数のCRT指数、正の整数
qInv (最初の)CRT係数、正の整数
r_i i番目の因数、正の整数
d_i i番目の因数のCRT指数、正の整数
t_i i番目の因数のCRT係数、正の整数

有効性制約​

最初の表現形式を持つ有効なRSA秘密鍵では、RSA剰余nは対応するRSA公開鍵のものと同じであり、u個の異なる奇素数r_i(i = 1, 2, ..., u、ただしu >= 2)の積です。RSA秘密指数dは、nより小さい正の整数で、次を満たします:

e * d == 1 (mod λ(n))

ここで、eは対応するRSA公開指数であり、λ(n)はセクション3.1で定義されています。

2番目の表現形式を持つ有効なRSA秘密鍵では、2つの因数pとqはRSA剰余nの最初の2つの素因数(すなわち、r_1とr_2)です。CRT指数dPとdQは、それぞれpとqより小さい正の整数で、次を満たします:

e * dP == 1 (mod (p-1))
e * dQ == 1 (mod (q-1))

CRT係数qInvは、pより小さい正の整数で、次を満たします:

q * qInv == 1 (mod p)

u > 2の場合、この表現には1つ以上の三つ組 (r_i, d_i, t_i)(i = 3, ..., u)が含まれます。因数r_iは、RSA剰余nの追加の素因数です。各CRT指数d_i(i = 3, ..., u)は次を満たします:

e * d_i == 1 (mod (r_i - 1))

各CRT係数t_i(i = 3, ..., u)は、r_i未満の正の整数で、次を満たします:

R_i * t_i == 1 (mod r_i)

ここで、R_i = r_1 * r_2 * ... * r_(i-1)です。

実装間でRSA秘密鍵を交換するための推奨構文は、付録A.1.2に示されています。これには両方の表現形式のコンポーネントが含まれています。実装の内部表現は異なる場合があります。

注記​

注記1:ここでのCRT係数の定義と、セクション5のプリミティブでそれらを使用する式は、一般的にGarnerのアルゴリズム [GARNER]([HANDBOOK] のアルゴリズム14.71も参照)に従っています。ただし、PKCS #1 v2.0および以前のバージョンのRSA秘密鍵の表現との互換性のため、pとqの役割は他の素数と比較して逆になっています。したがって、最初のCRT係数qInvは、R_1 mod r_2(すなわちp mod q)の逆数としてではなく、q mod pの逆数として定義されています。

注記2:QuisquaterとCouvreur [FASTDEC] は、RSA操作にCRTを適用する利点を観察しました。


4. Data Conversion Primitives (データ変換プリミティブ)​

本文書で定義されているスキームでは、2つのデータ変換プリミティブ (Data Conversion Primitives) が使用されます:

  • I2OSP - 整数からオクテット文字列へのプリミティブ (Integer-to-Octet-String Primitive)
  • OS2IP - オクテット文字列から整数へのプリミティブ (Octet-String-to-Integer Primitive)

本文書の目的上、およびASN.1構文と一致して、オクテット文字列 (Octet String) はオクテット(8ビットバイト)の順序付きシーケンスです。このシーケンスは、最初(慣例により、最も左)から最後(最も右)まで索引付けされます。整数との変換のため、以下の変換プリミティブでは、最初のオクテットが最上位として扱われます。

4.1. I2OSP​

I2OSPは、非負整数を指定された長さのオクテット文字列に変換します。

I2OSP (x, xLen)

入力 (Input)​

x        変換する非負整数
xLen 結果のオクテット文字列の意図された長さ

出力 (Output)​

X        長さxLenの対応するオクテット文字列

エラー (Error)​

"integer too large" (整数が大きすぎる)

ステップ (Steps)​

ステップ1. x >= 256^xLenの場合、"integer too large" を出力して停止します。

ステップ2. 整数xをその一意のxLen桁の256進数表現として書きます:

x = x_(xLen-1) * 256^(xLen-1) + x_(xLen-2) * 256^(xLen-2) + ... + x_1 * 256 + x_0

ここで、0 <= x_i < 256 です(注:xが256^(xLen-1)より小さい場合、1つ以上の先行桁はゼロになります)。

ステップ3. オクテットX_iの整数値をx_(xLen-i)とします。ここで、1 <= i <= xLen です。次のオクテット文字列を出力します:

X = X_1 X_2 ... X_xLen

4.2. OS2IP​

OS2IPは、オクテット文字列を非負整数に変換します。

OS2IP (X)

入力 (Input)​

X        変換するオクテット文字列

出力 (Output)​

x        対応する非負整数

ステップ (Steps)​

ステップ1. X_1 X_2 ... X_xLenをXの最初から最後までのオクテットとし、x_(xLen-i)をオクテットX_iの整数値とします。ここで、1 <= i <= xLen です。

ステップ2. 次のように定義します:

x = x_(xLen-1) * 256^(xLen-1) + x_(xLen-2) * 256^(xLen-2) + ... + x_1 * 256 + x_0

ステップ3. xを出力します。


5. Cryptographic Primitives (暗号プリミティブ)​

暗号プリミティブ (Cryptographic Primitives) は、暗号スキームを構築できる基本的な数学演算です。これらは、ハードウェア実装またはソフトウェアモジュールとして使用されることを意図しており、スキームとは別に単独でセキュリティを提供することは意図されていません。

本文書では、4つのタイプのプリミティブをペアで構成して規定しています:暗号化と復号化 (Encryption and Decryption)、署名と検証 (Signature and Verification)。

プリミティブの仕様は、入力が特定の条件を満たすこと、特にRSA公開鍵と秘密鍵が有効であることを前提としています。

5.1. 暗号化と復号化プリミティブ (Encryption and Decryption Primitives)​

暗号化プリミティブ (Encryption Primitive) は、公開鍵の制御下でメッセージ代表値から暗号文代表値を生成し、復号化プリミティブ (Decryption Primitive) は、対応する秘密鍵の制御下で暗号文代表値からメッセージ代表値を復元します。

本文書で定義されている暗号化スキームでは、1組の暗号化と復号化プリミティブが使用され、ここで規定されています:RSA暗号化プリミティブ (RSAEP, RSA Encryption Primitive) / RSA復号化プリミティブ (RSADP, RSA Decryption Primitive)。RSAEPとRSADPは同じ数学演算を含みますが、異なる鍵が入力されます。ここで定義されているプリミティブは、IEEE 1363 [IEEE1363] のRSAを使用した整数因数分解暗号化プリミティブ (IFEP-RSA) / RSAを使用した整数因数分解復号化プリミティブ (IFDP-RSA) と同じです(マルチプライムRSAのサポート追加を除く)。また、PKCS #1 v1.5と互換性があります。

各プリミティブの主要な数学演算は、べき乗演算 (Exponentiation) です。

5.1.1. RSAEP​

RSAEP ((n, e), m)

入力 (Input)​
(n, e)   RSA公開鍵
m メッセージ代表値、0とn - 1の間の整数
出力 (Output)​
c        暗号文代表値、0とn - 1の間の整数
エラー (Error)​

"message representative out of range" (メッセージ代表値が範囲外)

前提条件 (Assumption)​

RSA公開鍵 (n, e) は有効である

ステップ (Steps)​

ステップ1. メッセージ代表値mが0とn - 1の間にない場合、"message representative out of range" を出力して停止します。

ステップ2. c = m^e mod n とします。

ステップ3. cを出力します。

5.1.2. RSADP​

RSADP (K, c)

入力 (Input)​
K        RSA秘密鍵。Kは次のいずれかの形式を持ちます:
- ペア (n, d)
- 五つ組 (p, q, dP, dQ, qInv) と、空の可能性がある三つ組のシーケンス (r_i, d_i, t_i)、i = 3、...、u
c 暗号文代表値、0とn - 1の間の整数
出力 (Output)​
m        メッセージ代表値、0とn - 1の間の整数
エラー (Error)​

"ciphertext representative out of range" (暗号文代表値が範囲外)

前提条件 (Assumption)​

RSA秘密鍵Kは有効である

ステップ (Steps)​

ステップ1. 暗号文代表値cが0とn - 1の間にない場合、"ciphertext representative out of range" を出力して停止します。

ステップ2. メッセージ代表値mは次のように計算されます:

a. Kの第1の形式 (n, d) を使用する場合、m = c^d mod n とします。

b. Kの第2の形式 (p, q, dP, dQ, qInv) と (r_i, d_i, t_i) を使用する場合、次のステップを実行します:

i. m_1 = c^dP mod p かつ m_2 = c^dQ mod q とします。

ii. u > 2の場合、m_i = c^(d_i) mod r_i、i = 3、...、u とします。

iii. h = (m_1 - m_2) * qInv mod p とします。

iv. m = m_2 + q * h とします。

v. u > 2の場合、R = r_1 とし、i = 3からuまで次を実行します:

  1. R = R * r_(i-1) とします。
  2. h = (m_i - m) * t_i mod r_i とします。
  3. m = m + R * h とします。

ステップ3. mを出力します。

注意:ステップ2.bは、pとqの順序を逆にすれば、単一のループとして書き直すことができます。ただし、PKCS #1 v2.0との一貫性を保つため、最初の2つの素数pとqは追加の素数とは別に処理されます。

5.2. 署名と検証プリミティブ (Signature and Verification Primitives)​

署名プリミティブ (Signature Primitive) は、秘密鍵の制御下でメッセージ代表値から署名代表値を生成し、検証プリミティブ (Verification Primitive) は、対応する公開鍵の制御下で署名代表値からメッセージ代表値を復元します。本文書で定義されている署名スキームでは、1組の署名と検証プリミティブが使用され、ここで規定されています:RSA署名プリミティブバージョン1 (RSASP1、RSA Signature Primitive、version 1) / RSA検証プリミティブバージョン1 (RSAVP1、RSA Verification Primitive、version 1)。

ここで定義されているプリミティブは、IEEE 1363 [IEEE1363] のRSAを使用した整数因数分解署名プリミティブバージョン1 (IFSP-RSA1) / RSAを使用した整数因数分解検証プリミティブバージョン1 (IFVP-RSA1) と同じです(マルチプライムRSAのサポート追加を除く)。また、PKCS #1 v1.5と互換性があります。

各プリミティブの主要な数学演算は、セクション5.1の暗号化と復号化プリミティブと同じく、べき乗演算です。RSASP1とRSAVP1は、RSADPとRSAEPと同じですが、入力パラメータと出力パラメータの名前が異なります。これらを区別する理由は、異なる目的で使用されるためです。

5.2.1. RSASP1​

RSASP1 (K, m)

入力 (Input)​
K        RSA秘密鍵。Kは次のいずれかの形式を持ちます:
- ペア (n, d)
- 五つ組 (p, q, dP, dQ, qInv) と、空の可能性がある三つ組のシーケンス (r_i, d_i, t_i)、i = 3、...、u
m メッセージ代表値、0とn - 1の間の整数
出力 (Output)​
s        署名代表値、0とn - 1の間の整数
エラー (Error)​

"message representative out of range" (メッセージ代表値が範囲外)

前提条件 (Assumption)​

RSA秘密鍵Kは有効である

ステップ (Steps)​

ステップ1. メッセージ代表値mが0とn - 1の間にない場合、"message representative out of range" を出力して停止します。

ステップ2. 署名代表値sは次のように計算されます:

a. Kの第1の形式 (n, d) を使用する場合、s = m^d mod n とします。

b. Kの第2の形式 (p, q, dP, dQ, qInv) と (r_i, d_i, t_i) を使用する場合、次のステップを実行します:

  1. s_1 = m^dP mod p かつ s_2 = m^dQ mod q とします。
  2. u > 2の場合、s_i = m^(d_i) mod r_i、i = 3、...、u とします。
  3. h = (s_1 - s_2) * qInv mod p とします。
  4. s = s_2 + q * h とします。
  5. u > 2の場合、R = r_1 とし、i = 3からuまで次を実行します:
    • a. R = R * r_(i-1) とします。
    • b. h = (s_i - s) * t_i mod r_i とします。
    • c. s = s + R * h とします。

ステップ3. sを出力します。

注意:ステップ2.bは、pとqの順序を逆にすれば、単一のループとして書き直すことができます。ただし、PKCS #1 v2.0との一貫性を保つため、最初の2つの素数pとqは追加の素数とは別に処理されます。

5.2.2. RSAVP1​

RSAVP1 ((n, e), s)

入力 (Input)​
(n, e)   RSA公開鍵
s 署名代表値、0とn - 1の間の整数
出力 (Output)​
m        メッセージ代表値、0とn - 1の間の整数
エラー (Error)​

"signature representative out of range" (署名代表値が範囲外)

前提条件 (Assumption)​

RSA公開鍵 (n, e) は有効である

ステップ (Steps)​

ステップ1. 署名代表値sが0とn - 1の間にない場合、"signature representative out of range" を出力して停止します。

ステップ2. m = s^e mod n とします。

ステップ3. mを出力します。


6. Overview of Schemes (スキームの概要)​

スキーム (Scheme) は、暗号プリミティブとその他の技術を組み合わせて、特定のセキュリティ目標を達成します。本文書では、2つのタイプのスキームを規定しています:暗号化スキーム (Encryption Schemes) と付録付き署名スキーム (Signature Schemes with Appendix)。

本文書で規定されているスキームは、その動作がRSA公開鍵または秘密鍵を使用してデータを処理するステップのみを含み、鍵の取得または検証のステップを含まないという点で、範囲が限定されています。したがって、スキーム操作に加えて、アプリケーションには通常、当事者がスキーム操作用のRSA公開鍵と秘密鍵を選択できる鍵管理操作 (Key Management Operations) が含まれます。特定の追加操作およびその他の詳細は、本文書の範囲外です。

暗号プリミティブ(セクション5)の場合と同様に、スキーム操作の仕様は、入力が特定の条件を満たすこと、特にRSA公開鍵と秘密鍵が有効であることを前提としています。したがって、鍵が無効な場合、実装の動作は規定されていません。この規定されていない動作の影響は、アプリケーションに依存します。鍵検証の問題に対処する可能性のあるアプローチには、次のものがあります:アプリケーションによる明示的な鍵検証、公開鍵基盤内での鍵検証、および無効な鍵を使用して操作を実行する責任を鍵を生成した当事者に割り当てること。

一般的に良好な暗号実践は、特定のRSA鍵ペアを1つのスキームでのみ使用することです。これにより、1つのスキームの脆弱性が別のスキームのセキュリティを損なう可能性があるリスクが回避され、証明可能なセキュリティ (Provable Security) を維持するために重要である可能性があります。RSAES-PKCS1-v1_5(セクション7.2)とRSASSA-PKCS1-v1_5(セクション8.2)は、既知の悪影響のある相互作用なしに従来から一緒に使用されてきました(実際、これはPKCS #1 v1.5で導入されたモデルです)が、新しいアプリケーションでは、このようなRSA鍵ペアの組み合わせ使用は推奨されません (NOT RECOMMENDED)。

複数のスキームでRSA鍵ペアを使用することに関連するリスクを説明するために、RSA鍵ペアがRSAES-OAEP(セクション7.1)とRSAES-PKCS1-v1_5の両方に使用されると仮定します。RSAES-OAEP自体は攻撃に対して耐性がありますが、攻撃者はRSAES-PKCS1-v1_5実装の弱点を悪用して、いずれかのスキームで暗号化されたメッセージを復元できる可能性があります。別の例として、RSA鍵ペアがRSASSA-PSS(セクション8.1)とRSASSA-PKCS1-v1_5の両方に使用されると仮定します。その場合、RSASSA-PSSのセキュリティ証明は、第2のスキームを使用して署名が生成される可能性を考慮していないため、もはや十分ではありません。RSA鍵ペアがここで定義されているスキームの1つと他の場所で定義されている変種に使用される場合、同様の考慮事項が適用される可能性があります。


7. Encryption Schemes (暗号化スキーム)​

本文書の目的上、暗号化スキーム (Encryption Scheme) は、暗号化操作と復号化操作で構成されます。暗号化操作は、受信者のRSA公開鍵を使用してメッセージから暗号文を生成し、復号化操作は、受信者の対応するRSA秘密鍵を使用して暗号文からメッセージを復元します。

暗号化スキームは、さまざまなアプリケーションシナリオに適用できます。典型的なアプリケーションは、鍵確立プロトコル (Key Establishment Protocol) です。このプロトコルでは、メッセージに、一方の当事者から別の当事者に秘密裏に転送する必要がある鍵素材が含まれています。たとえば、PKCS #7 [RFC2315] は、このようなプロトコルを使用して、送信者から受信者にコンテンツ暗号化鍵を転送します。本文書で定義されている暗号化スキームは、このコンテキストで鍵暗号化アルゴリズムとして使用するのに適しています。

本文書では、2つの暗号化スキームを規定しています:RSAES-OAEPとRSAES-PKCS1-v1_5。新しいアプリケーションは、RSAES-OAEPをサポートすることが必須 (REQUIRED) です。RSAES-PKCS1-v1_5は、既存のアプリケーションとの互換性のためにのみ含まれています。

ここで示されている暗号化スキームは、IEEE 1363 [IEEE1363] で使用されているのと同様の一般的なモデルに従い、暗号化と復号化のプリミティブを暗号化用のエンコーディング方法と組み合わせています。暗号化操作は、メッセージにメッセージエンコーディング操作を適用してエンコードされたメッセージを生成し、それを整数メッセージ代表値に変換します。暗号化プリミティブをメッセージ代表値に適用して暗号文を生成します。逆に、復号化操作は、復号化プリミティブを暗号文に適用してメッセージ代表値を復元し、それをオクテット文字列のエンコードされたメッセージに変換します。メッセージデコーディング操作をエンコードされたメッセージに適用して、メッセージを復元し、復号化の正確性を検証します。

デコーディング操作でのエラー処理方法に関連する実装の弱点を回避するため([BLEICHENBACHER] および [MANGER] を参照)、RSAES-OAEPとRSAES-PKCS1-v1_5のエンコーディングおよびデコーディング操作は、別個の仕様で定義されるのではなく、各暗号化スキームの仕様に埋め込まれています。両方の暗号化スキームは、PKCS #1 v2.1の対応するスキームと互換性があります。

7.1. RSAES-OAEP​

RSAES-OAEPは、RSAEPおよびRSADPプリミティブ(セクション5.1)とEME-OAEPエンコーディング方法(本セクションに埋め込まれています)を組み合わせています。これは、[OAEP] で最初に導入されたBellareとRogawayの最適非対称暗号化パディング (Optimal Asymmetric Encryption Padding, OAEP) 方法に基づいています。EME-OAEPは、IEEE 1363 [IEEE1363] のEME-OAEPの一方向バリアントです。

このスキームは決定論的ではありません:与えられた公開鍵とメッセージに対して、多くの可能な暗号文を生成できます。

RSAES-OAEPは、新しいアプリケーションに推奨されます。RSAES-OAEPは、任意のアプリケーションでRSAES-PKCS1-v1_5の代替として優先的に使用できます。

本スキームのセキュリティは、2つの関数の困難性に基づいています:RSA問題とマスク生成関数 (Mask Generation Function, MGF) のランダムオラクルモデル。これら2つの関数のセキュリティ特性は、定理証明に具体化されています。この証明は、選択暗号文攻撃 (Chosen Ciphertext Attack) に対してRSAES-OAEPを使用する困難性が、MGFがランダムオラクル (Random Oracle) のように動作することを前提として、RSA問題を解決する困難性と本質的に同等であることを示しています。

7.1.1. 暗号化操作 (Encryption Operation)​

RSAES-OAEP-ENCRYPT ((n, e), M, L)

入力 (Input):

  • (n, e): 受信者のRSA公開鍵(kは剰余の長さをオクテット単位で表します)
  • M: 暗号化するメッセージ、長さが最大k - 2hLen - 2のオクテット文字列。ここで、hLenはハッシュ関数Hashの出力長(オクテット単位)
  • L: 暗号化操作に関連付けられたオプションのラベル (Label)。デフォルト値は空文字列

出力 (Output):

  • C: 暗号文、長さkのオクテット文字列

エラー (Errors):

  • "message too long" (メッセージが長すぎる)
  • "label too long" (ラベルが長すぎる)

前提条件 (Assumption): RSA公開鍵 (n, e) は有効である

ステップ (Steps):

  1. 長さチェック: Lの長さがマスク生成関数の入力制限(2^61 - 1オクテット)を超える場合、"label too long" を出力して停止します。

  2. EME-OAEPエンコーディング:

    • Mの長さがk - 2hLen - 2オクテットを超える場合、"message too long" を出力して停止します。
    • lHash = Hash(L) とします。長さhLenのオクテット文字列です。
    • k - mLen - 2hLen - 2個のゼロオクテットと、値0x01の単一オクテットで構成されるパディング文字列PSを生成します。
    • lHash、PS、0x01単一バイト、およびメッセージMを連結してデータブロックDBを形成します: DB = lHash || PS || 0x01 || M
    • 長さhLenのランダムオクテット文字列seedを生成します。
    • dbMask = MGF(seed, k - hLen - 1) とします。
    • maskedDB = DB ⊕ dbMask とします。
    • seedMask = MGF(maskedDB, hLen) とします。
    • maskedSeed = seed ⊕ seedMask とします。
    • 値0x00の単一オクテット、maskedSeed、およびmaskedDBを連結してエンコードされたメッセージEMを形成します: EM = 0x00 || maskedSeed || maskedDB
  3. RSA暗号化:

    • エンコードされたメッセージEMを整数メッセージ代表値mに変換します: m = OS2IP(EM)
    • RSAEP暗号化プリミティブを適用します: c = RSAEP((n, e), m)
    • 暗号文代表値cを長さkの暗号文Cに変換します: C = I2OSP(c, k)
  4. 暗号文Cを出力します。

7.1.2. 復号化操作 (Decryption Operation)​

RSAES-OAEP-DECRYPT (K, C, L)

入力 (Input):

  • K: 受信者のRSA秘密鍵
  • C: 復号化する暗号文、長さkのオクテット文字列。ここで、kはRSA剰余nの長さ(オクテット単位)
  • L: オプションのラベル。その値は、暗号文が生成された暗号化操作中のラベルに関連付けられています。デフォルト値は空文字列

出力 (Output):

  • M: メッセージ、長さが最大k - 2hLen - 2のオクテット文字列

エラー (Error):

  • "decryption error" (復号化エラー)

ステップ (Steps):

  1. 長さチェック: Lの長さが入力制限を超える場合、"decryption error" を出力して停止します。暗号文Cの長さがkオクテットでない場合(またはk < 2hLen + 2の場合)、"decryption error" を出力して停止します。

  2. RSA復号化:

    • 暗号文Cを整数暗号文代表値cに変換します: c = OS2IP(C)
    • RSADP復号化プリミティブを適用します: m = RSADP(K, c)。RSADPが "ciphertext representative out of range" を出力した場合、"decryption error" を出力して停止します。
    • メッセージ代表値mを長さkのエンコードされたメッセージEMに変換します: EM = I2OSP(m, k)
  3. EME-OAEPデコーディング:

    • lHash = Hash(L) とします。
    • EMを単一オクテットY、長さhLenのオクテット文字列maskedSeed、および長さk - hLen - 1のオクテット文字列maskedDBに分離します: EM = Y || maskedSeed || maskedDB
    • seedMask = MGF(maskedDB, hLen) とします。
    • seed = maskedSeed ⊕ seedMask とします。
    • dbMask = MGF(seed, k - hLen - 1) とします。
    • DB = maskedDB ⊕ dbMask とします。
    • DBを長さhLenのオクテット文字列lHash'、(空の可能性がある)パディング文字列PS(値0x00のオクテットで構成)、値0x01の単一オクテット、およびメッセージMに分離します: DB = lHash' || PS || 0x01 || M。PSとMを分離する値0x01のオクテットがない場合、lHashがlHash'と等しくない場合、またはYがゼロでない場合は、"decryption error" を出力して停止します。
  4. メッセージMを出力します。

注意: 実装が意図せず敵対者に有用な情報を提供しないよう、慎重に実装する必要があります。特に、エラーメッセージは、EM内のオクテットまたはDB内の他のオクテットが予期された形式でないかどうかを明らかにしてはなりません。

7.2. RSAES-PKCS1-v1_5​

RSAES-PKCS1-v1_5は、RSAEPおよびRSADPプリミティブ(セクション5.1)とEME-PKCS1-v1_5エンコーディング方法を組み合わせています。これは、既存のアプリケーションとの互換性のためにのみ含まれています。新しいアプリケーションには、RSAES-OAEPの使用が推奨されます。

RSAES-PKCS1-v1_5のセキュリティは、RSA問題の困難性に依存しています。既知の潜在的な弱点([BLEICHENBACHER] を参照)があるため、新しいアプリケーションではRSAES-OAEPを使用する必要があります。

7.2.1. 暗号化操作 (Encryption Operation)​

RSAES-PKCS1-V1_5-ENCRYPT ((n, e), M)

入力、出力、およびステップはRSAES-OAEPと同様ですが、EME-PKCS1-v1_5エンコーディングを使用します

7.2.2. 復号化操作 (Decryption Operation)​

RSAES-PKCS1-V1_5-DECRYPT (K, C)

入力、出力、およびステップはRSAES-OAEPと同様ですが、EME-PKCS1-v1_5デコーディングを使用します

重要なセキュリティ注意事項: 復号化エラーメッセージは、Bleichenbacher選択暗号文攻撃を防ぐために、異なるタイプのエラーを区別してはなりません。


8. Signature Scheme with Appendix (付録付き署名スキーム)​

付録付き署名スキーム (Signature Scheme with Appendix) は、署名生成操作と署名検証操作で構成されます。署名生成操作は、署名者のRSA秘密鍵を使用してメッセージから署名を生成し、署名検証操作は、署名者のRSA公開鍵を使用して署名の真正性を検証します。

メッセージMに署名するために、署名者はMにメッセージエンコーディング操作を適用してエンコードされたメッセージEMを生成し、次に署名プリミティブを適用して署名Sを生成します。署名Sを検証するために、検証者はSに検証プリミティブを適用してエンコードされたメッセージEMを復元し、次に検証操作を適用して署名がメッセージに対して有効かどうかを判断します。

本文書では、2つの署名スキームが規定されています:RSASSA-PSSとRSASSA-PKCS1-v1_5。

必須ではありませんが、RSASSA-PSSは新しいアプリケーションに推奨されます。RSASSA-PKCS1-v1_5は、既存のアプリケーションとの互換性のために含まれています。

8.1. RSASSA-PSS​

RSASSA-PSSは、RSASP1およびRSAVP1プリミティブ(セクション5.2)とEMSA-PSSエンコーディング方法を組み合わせています。これは、BellareとRogawayによって提案された確率的署名スキーム (Probabilistic Signature Scheme, PSS) [RSARABIN] [PSS] に基づいています。

PSSのセキュリティは、RSA問題の困難性とMGFのランダムオラクルモデルに基づいています。ランダムオラクルモデルの下で、MGFがランダムオラクルのように動作し、RSA問題が困難である場合、PSS署名スキームは選択メッセージ攻撃 (Chosen Message Attack) に対して安全であることが証明されています。

RSASSA-PSSは決定論的ではありません:与えられたメッセージに対して、複数の可能な署名を生成できます。これは、署名生成操作中にランダムなソルト値が含まれるためです。

8.1.1. 署名生成操作 (Signature Generation Operation)​

RSASSA-PSS-SIGN (K, M)

入力 (Input):

  • K: 署名者のRSA秘密鍵
  • M: 署名するメッセージ、任意の長さのオクテット文字列

出力 (Output):

  • S: 署名、長さkのオクテット文字列。ここで、kはRSA剰余nの長さ(オクテット単位)

エラー (Errors):

  • "message too long" (メッセージが長すぎる)
  • "encoding error" (エンコーディングエラー)

ステップ (Steps):

  1. EMSA-PSSエンコーディング: メッセージMにEMSA-PSSエンコーディング操作を適用して、長さ⌈(modBits-1)/8⌉オクテットのエンコードされたメッセージEMを生成します。ここで、modBitsはRSA剰余nの長さ(ビット単位)です: EM = EMSA-PSS-ENCODE(M, modBits - 1)。エンコーディング操作が "message too long" または "encoding error" を出力した場合、対応するエラーを出力して停止します。

  2. RSA署名:

    • エンコードされたメッセージEMを整数メッセージ代表値mに変換します: m = OS2IP(EM)
    • RSASP1署名プリミティブを適用します: s = RSASP1(K, m)
    • 署名代表値sを長さkの署名Sに変換します: S = I2OSP(s, k)
  3. 署名Sを出力します。

8.1.2. 署名検証操作 (Signature Verification Operation)​

RSASSA-PSS-VERIFY ((n, e), M, S)

入力 (Input):

  • (n, e): 署名者のRSA公開鍵
  • M: メッセージ、任意の長さのオクテット文字列
  • S: 検証する署名、長さkのオクテット文字列

出力 (Output):

  • "valid signature" (有効な署名) または "invalid signature" (無効な署名)

ステップ (Steps):

  1. 長さチェック: 署名Sの長さがkオクテットでない場合、"invalid signature" を出力して停止します。

  2. RSA検証:

    • 署名Sを整数署名代表値sに変換します: s = OS2IP(S)
    • RSAVP1検証プリミティブを適用します: m = RSAVP1((n, e), s)。RSAVP1が "signature representative out of range" を出力した場合、"invalid signature" を出力して停止します。
    • メッセージ代表値mを長さemLen = ⌈(modBits - 1)/8⌉のエンコードされたメッセージEMに変換します: EM = I2OSP(m, emLen)
  3. EMSA-PSS検証: EMSA-PSS検証操作を適用します: Result = EMSA-PSS-VERIFY(M, EM, modBits - 1)。Result = "consistent" の場合、"valid signature" を出力します。それ以外の場合、"invalid signature" を出力します。

8.2. RSASSA-PKCS1-v1_5​

RSASSA-PKCS1-v1_5は、RSASP1およびRSAVP1プリミティブ(セクション5.2)とEMSA-PKCS1-v1_5エンコーディング方法を組み合わせています。これは、IEEE 1363 [IEEE1363] のIFSSAスキームと互換性があり、DigestInfo値のハッシュ関数を使用してメッセージ代表値を生成します。

RSASSA-PKCS1-v1_5のセキュリティは、RSA問題の困難性に依存しています。このスキームを破る既知の攻撃はありませんが、PSSのようなセキュリティ証明もありません。

8.2.1. 署名生成操作 (Signature Generation Operation)​

RSASSA-PKCS1-V1_5-SIGN (K, M)

ステップはRSASSA-PSSと同様ですが、EMSA-PKCS1-v1_5エンコーディング方法を使用します

8.2.2. 署名検証操作 (Signature Verification Operation)​

RSASSA-PKCS1-V1_5-VERIFY ((n, e), M, S)

ステップはRSASSA-PSSと同様ですが、EMSA-PKCS1-v1_5検証方法を使用します


9. Encoding Methods for Signatures with Appendix (付録付き署名のエンコーディング方法)​

エンコーディング方法は、メッセージをエンコードされたメッセージに変換するために使用されます。エンコードされたメッセージは、その後RSA署名プリミティブによって署名できます。本セクションでは、2つのエンコーディング方法を規定しています:EMSA-PSSとEMSA-PKCS1-v1_5。

9.1. EMSA-PSS​

EMSA-PSS (Encoding Method for Signatures with Appendix - Probabilistic Signature Scheme) は、ランダム性を含む確率的エンコーディング方法であり、したがって与えられたメッセージに対して複数の異なるエンコードされたメッセージを生成できます。

9.1.1. エンコーディング操作 (Encoding Operation)​

EMSA-PSS-ENCODE (M, emBits)

入力 (Input):

  • M: エンコードするメッセージ、任意の長さのオクテット文字列
  • emBits: エンコードされたメッセージの最大ビット長、少なくとも8hLen + 8sLen + 9

出力 (Output):

  • EM: エンコードされたメッセージ、長さemLen = ⌈emBits/8⌉のオクテット文字列

ステップ (Steps):

  1. Mの長さがハッシュ関数Hashの入力制限(SHA-1の場合2^61 - 1オクテット)より大きい場合、"message too long" を出力して停止します。

  2. mHash = Hash(M) とします。長さhLenのオクテット文字列です。

  3. emLen < hLen + sLen + 2の場合、"encoding error" を出力して停止します。

  4. 長さsLenのランダムオクテット文字列saltを生成します。

  5. M' = (0x)00 00 00 00 00 00 00 00 || mHash || salt とします。M'は長さ8 + hLen + sLenのオクテット文字列です。

  6. H = Hash(M') とします。長さhLenのオクテット文字列です。

  7. emLen - sLen - hLen - 2個のゼロオクテットで構成されるオクテット文字列PSを生成します。

  8. DB = PS || 0x01 || salt とします。DBは長さemLen - hLen - 1のオクテット文字列です。

  9. dbMask = MGF(H, emLen - hLen - 1) とします。

  10. maskedDB = DB ⊕ dbMask とします。

  11. maskedDBの最も左の8emLen - emBitsビットをゼロに設定します。

  12. EM = maskedDB || H || 0xbc とします。

  13. EMを出力します。

9.1.2. 検証操作 (Verification Operation)​

EMSA-PSS-VERIFY (M, EM, emBits)

入力 (Input):

  • M: メッセージ、任意の長さのオクテット文字列
  • EM: 検証するエンコードされたメッセージ、長さemLen = ⌈emBits/8⌉のオクテット文字列
  • emBits: エンコードされたメッセージの最大ビット長

出力 (Output):

  • "consistent" (一致) または "inconsistent" (不一致)

ステップ: (検証ステップはエンコーディングステップの逆で、すべての制約をチェックします)

9.2. EMSA-PKCS1-v1_5​

EMSA-PKCS1-v1_5 (Encoding Method for Signatures with Appendix - PKCS #1 v1.5) は、決定論的エンコーディング方法であり、与えられたメッセージに対して常に同じエンコードされたメッセージを生成します。

EMSA-PKCS1-v1_5-ENCODE (M, emLen)

入力 (Input):

  • M: エンコードするメッセージ、任意の長さのオクテット文字列
  • emLen: エンコードされたメッセージの期待される長さ(オクテット単位)、少なくともtLen + 11。ここで、tLenはDigestInfo値のオクテット長

出力 (Output):

  • EM: エンコードされたメッセージ、長さemLenのオクテット文字列

ステップ (Steps):

  1. メッセージMにハッシュ関数を適用してハッシュ値Hを生成します: H = Hash(M)。ハッシュ関数が "message too long" を出力した場合、"message too long" を出力して停止します。

  2. セクション9.2の注記の技術を使用して、ハッシュ関数のDigestInfo値をTとしてエンコードします。

  3. emLen < tLen + 11の場合、"intended encoded message length too short" を出力して停止します。

  4. emLen - tLen - 3個の値0xffのオクテットで構成されるオクテット文字列PSを生成します。

  5. PSおよび他のパディングを連結してエンコードされたメッセージEMを形成します: EM = 0x00 || 0x01 || PS || 0x00 || T

  6. EMを出力します。


10. セキュリティに関する考慮事項​

セキュリティに関する考慮事項は、本書の各所で扱われている。

主なセキュリティ上の要点​

鍵長​

RSA 鍵の安全性は、法の大きさに大きく依存する。推奨される最小鍵長は次のとおりである。

  • 2048 ビット: 現在推奨される最小長
  • 3072 ビット: 高い安全性が必要な用途で推奨
  • 4096 ビット: 長期鍵または非常に高いセキュリティ要件向け

方式の選択​

  • RSAES-OAEP: 新しいアプリケーションがサポートしなければならない(REQUIRED)暗号化方式
  • RSASSA-PSS: 新しいアプリケーションでの使用が推奨される(RECOMMENDED)署名方式
  • PKCS1-v1_5: 互換性のためだけに残されており、既知の弱点がある

実装上の注意​

  1. 乱数生成: 暗号学的に安全な乱数生成器を使用しなければならない。
  2. サイドチャネル攻撃: 実装はタイミング攻撃および電力解析を防止するべきである。
  3. エラー処理: 復号および検証操作のエラーメッセージは統一し、情報漏えいを避けるべきである。
  4. パディングオラクル攻撃: RSAES-PKCS1-v1_5 は Bleichenbacher 攻撃に対して脆弱であり、実装時には特に注意が必要である。

ハッシュ関数​

  • 使用を避ける: MD5、SHA-1(破られている)
  • 推奨: SHA-256、SHA-384、SHA-512

鍵の使用​

  • 単一目的: 1 つの RSA 鍵ペアは、暗号化または署名のいずれか 1 つの方式にのみ使用するべきであり、混用してはならない。
  • 鍵のローテーション: 鍵を定期的に交換する。
  • 秘密鍵の保護: 秘密鍵は暗号化して保管するべきであり、ハードウェアセキュリティモジュール(HSM)の使用はベストプラクティスである。

既知の攻撃と防御​

  • 選択暗号文攻撃(Chosen Ciphertext Attack): RSAES-OAEP が防御を提供する。
  • 選択メッセージ攻撃(Chosen Message Attack): RSASSA-PSS が防御を提供する。
  • Bleichenbacher 攻撃: RSAES-PKCS1-v1_5 に影響する。
  • タイミング攻撃: 定数時間アルゴリズムおよび CRT 高速化を使用する場合は注意が必要である。

複数の方式で同じ鍵ペアを使用しないことについては、6 節の議論を参照。


Appendix A. ASN.1 Syntax (ASN.1構文)​

本附録は、本文書で使用されるASN.1構文を要約しています。附録Cには完全なASN.1モジュールが含まれています。

A.1. RSA Key Representation (RSA鍵表現)​

本セクションでは、RSA公開鍵と秘密鍵のASN.1構文を定義します。

A.1.1. RSA Public Key Syntax (RSA公開鍵構文)​

RSA公開鍵は、ASN.1型RSAPublicKeyとして表現される必要があります:

RSAPublicKey ::= SEQUENCE {
modulus INTEGER, -- n
publicExponent INTEGER -- e
}

フィールドの説明:

  • modulus: RSA剰余n
  • publicExponent: RSA公開鍵指数e

有効なRSA公開鍵では、剰余nの値はu個の異なる奇素数r_i (i = 1, 2, ..., u)の積である必要があり、ここでu >= 2であり、公開鍵指数eは3とn - 1の間の整数で、GCD(e, λ(n)) = 1を満たす必要があります。

A.1.2. RSA Private Key Syntax (RSA秘密鍵構文)​

RSA秘密鍵は、ASN.1型RSAPrivateKeyとして表現される必要があります:

RSAPrivateKey ::= SEQUENCE {
version Version,
modulus INTEGER, -- n
publicExponent INTEGER, -- e
privateExponent INTEGER, -- d
prime1 INTEGER, -- p
prime2 INTEGER, -- q
exponent1 INTEGER, -- d mod (p-1)
exponent2 INTEGER, -- d mod (q-1)
coefficient INTEGER, -- (inverse of q) mod p
otherPrimeInfos OtherPrimeInfos OPTIONAL
}

Version ::= INTEGER { two-prime(0), multi(1) }
(CONSTRAINED BY {
-- version must be multi if otherPrimeInfos present --
})

OtherPrimeInfos ::= SEQUENCE SIZE(1..MAX) OF OtherPrimeInfo

OtherPrimeInfo ::= SEQUENCE {
prime INTEGER, -- r_i
exponent INTEGER, -- d_i
coefficient INTEGER -- t_i
}

フィールドの説明:

  • version: バージョン番号(two-primeは2素数RSAを示し、multiは多素数RSAを示す)
  • modulus: RSA剰余n
  • publicExponent: RSA公開鍵指数e
  • privateExponent: RSA秘密鍵指数d
  • prime1: 第一の素因子p
  • prime2: 第二の素因子q
  • exponent1: d mod (p-1)
  • exponent2: d mod (q-1)
  • coefficient: CRT係数qInv、(q^-1) mod p
  • otherPrimeInfos: オプション、多素数RSAの追加素因子情報に使用

A.2. Scheme Identification (スキーム識別)​

本セクションでは、本文書で定義されている各種スキームのオブジェクト識別子(Object Identifiers)を定義します。

A.2.1. RSAES-OAEP​

RSAES-OAEP暗号化スキームのオブジェクト識別子:

id-RSAES-OAEP OBJECT IDENTIFIER ::= { pkcs-1 7 }

RSAES-OAEPのアルゴリズムパラメータ型:

RSAES-OAEP-params ::= SEQUENCE {
hashFunc [0] AlgorithmIdentifier DEFAULT sha1,
maskGenFunc [1] AlgorithmIdentifier DEFAULT mgf1SHA1,
pSourceFunc [2] AlgorithmIdentifier DEFAULT pSpecifiedEmpty
}

A.2.2. RSAES-PKCS1-v1_5​

RSAES-PKCS1-v1_5暗号化スキームのオブジェクト識別子:

id-RSAES-PKCS1-v1_5 OBJECT IDENTIFIER ::= { pkcs-1 1 }

このスキームには関連するパラメータがありません。

A.2.3. RSASSA-PSS​

RSASSA-PSS署名スキームのオブジェクト識別子:

id-RSASSA-PSS OBJECT IDENTIFIER ::= { pkcs-1 10 }

RSASSA-PSSのアルゴリズムパラメータ型:

RSASSA-PSS-params ::= SEQUENCE {
hashAlgorithm [0] AlgorithmIdentifier DEFAULT sha1,
maskGenAlgorithm [1] AlgorithmIdentifier DEFAULT mgf1SHA1,
saltLength [2] INTEGER DEFAULT 20,
trailerField [3] INTEGER DEFAULT 1
}

A.2.4. RSASSA-PKCS1-v1_5​

RSASSA-PKCS1-v1_5署名スキームは、異なるハッシュ関数に対して以下のオブジェクト識別子を使用します:

sha256WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 11 }
sha384WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 12 }
sha512WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 13 }

これらのオブジェクト識別子は、特定のハッシュ関数と関連付けられています。


Appendix B. Supporting Techniques (サポート技術)​

本附録には、本文書で使用されるサポート技術の仕様が含まれており、ハッシュ関数とマスク生成関数が含まれます。

B.1. Hash Functions (ハッシュ関数)​

ハッシュ関数は、任意長のメッセージを固定長の出力にマッピングするために使用されます。本文書のスキームで使用されるハッシュ関数は、以下の特性を満たす必要があります:

  1. 原像耐性 (Preimage Resistance): ハッシュ値hが与えられたとき、Hash(m) = hとなるメッセージmを見つけることが計算上困難である
  2. 第二原像耐性 (Second Preimage Resistance): メッセージm1が与えられたとき、Hash(m1) = Hash(m2)となる異なるメッセージm2を見つけることが計算上困難である
  3. 衝突耐性 (Collision Resistance): Hash(m1) = Hash(m2)となる任意の2つの異なるメッセージm1とm2を見つけることが計算上困難である

推奨されるハッシュ関数​

本文書では以下のハッシュ関数の使用を推奨します:

ハッシュ関数出力長(ビット)出力長(バイト)状態
SHA-116020⚠️ 廃止(後方互換性のみ)
SHA-25625632✅ 推奨
SHA-38438448✅ 推奨
SHA-51251264✅ 推奨
SHA-512/22422428✅ 利用可能
SHA-512/25625632✅ 利用可能

ハッシュ関数のASN.1識別子​

SHA-256のアルゴリズム識別子:

id-sha256 OBJECT IDENTIFIER ::= {
joint-iso-itu-t(2) country(16) us(840) organization(1)
gov(101) csor(3) nistalgorithm(4) hashalgs(2) 1
}

SHA-384のアルゴリズム識別子:

id-sha384 OBJECT IDENTIFIER ::= {
joint-iso-itu-t(2) country(16) us(840) organization(1)
gov(101) csor(3) nistalgorithm(4) hashalgs(2) 2
}

SHA-512のアルゴリズム識別子:

id-sha512 OBJECT IDENTIFIER ::= {
joint-iso-itu-t(2) country(16) us(840) organization(1)
gov(101) csor(3) nistalgorithm(4) hashalgs(2) 3
}

B.2. Mask Generation Functions (マスク生成関数)​

マスク生成関数 (Mask Generation Function, MGF) は、可変長のオクテット文字列と必要な出力長を入力として受け取り、指定された長さの出力オクテット文字列を生成します。マスク生成関数は、ハッシュ関数または他の関数に基づいている場合があります。

マスク生成関数の主な用途は、パディングスキームでランダムな外観のデータを生成することです。

B.2.1. MGF1​

MGF1は、ハッシュ関数に基づくマスク生成関数です。MGF1 (mgfSeed, maskLen)は、可変長のシードと必要なマスク長を入力として受け取り、指定された長さのマスクを出力します。

MGF1 (mgfSeed, maskLen)

入力 (Input)​
mgfSeed     マスク生成シード、任意長のオクテット文字列
maskLen 期待されるマスクの長さ(オクテット単位)
出力 (Output)​
mask        長さmaskLenのマスク、オクテット文字列
エラー (Error)​

"mask too long" (マスクが長すぎる)

ステップ (Steps)​
  1. maskLen > 2^32 * hLenの場合、"mask too long"を出力して停止します。

  2. Tを空のオクテット文字列とします。

  3. カウンタCを0から⌈maskLen / hLen⌉ - 1まで:

    • カウンタCを長さ4のオクテット文字列Cに変換します: C = I2OSP(C, 4)
    • mgfSeedとCのハッシュ値をTに連結します: T = T || Hash(mgfSeed || C)
  4. Tの最初のmaskLenオクテットをマスクとして出力します。

MGF1オプション (MGF1 Options)

MGF1のデフォルトハッシュ関数はSHA-1です。新しいアプリケーションでは、SHA-256以上のハッシュ関数の使用が推奨されます。

MGF1とSHA-256のASN.1識別子:

id-mgf1 OBJECT IDENTIFIER ::= { pkcs-1 8 }

-- MGF1のパラメータは使用されるハッシュ関数
AlgorithmIdentifier { ALGORITHM:IOSet } ::= SEQUENCE {
algorithm ALGORITHM.&id({IOSet}),
parameters ALGORITHM.&Type({IOSet}{@algorithm}) OPTIONAL
}

MGFのセキュリティに関する考慮事項​

ランダムオラクルモデルにおいて、基礎となるハッシュ関数が適切に動作する場合、MGF1の出力は計算上、真のランダム文字列と区別できません。これにより、MGF1はOAEPやPSSなどのスキームでの使用に適しています。


Appendix D. Revision History of PKCS #1 (PKCS #1の改訂履歴)​

バージョンの進化​

PKCS #1 v1.5 (1993年11月)​

  • 内容: RSA暗号化と署名の基本スキームを定義
  • 暗号化: RSAES-PKCS1-v1_5
  • 署名: RSASSA-PKCS1-v1_5
  • 状態: 広く展開されているが、既知のセキュリティ脆弱性が存在

PKCS #1 v2.0 (1998年9月, RFC 2437)​

  • 追加: RSAES-OAEP暗号化スキーム
  • 追加: RSASSA-PSS署名スキーム
  • 改善: 証明ベースのセキュアなスキームの導入
  • 保持: 後方互換性のためにv1.5スキームを保持

PKCS #1 v2.1 (2002年6月, RFC 3447)​

  • 改善: RSAES-OAEPとRSASSA-PSSの仕様を更新
  • 追加: 追加のハッシュ関数(SHA-256、SHA-384、SHA-512)のサポート
  • 追加: 完全なASN.1モジュール
  • 明確化: マルチプライムRSAの使用

PKCS #1 v2.2 (2012年10月 / 2016年11月, RFC 8017)​

  • 改善: 技術的な明確化と正誤表の修正
  • 更新: セキュリティに関する考慮事項の強化された説明
  • 追加: SHA-512/224およびSHA-512/256のサポート
  • 状態: 現在のバージョン、RFC 8017として公開

主要な変更の要約​

  1. v1.5 → v2.0: 証明可能に安全なOAEPおよびPSSスキームの導入
  2. v2.0 → v2.1: ハッシュ関数サポートの強化とマルチプライムRSA
  3. v2.1 → v2.2: 技術的な明確化とセキュリティ推奨事項の更新
  4. RFC移行: RSA LabのPKCSシリーズからIETF RFCシリーズへの移行

廃止に関する説明​

  • RFC 3447 (PKCS #1 v2.1) は本文書 (RFC 8017, PKCS #1 v2.2) によって廃止されました
  • RSAES-PKCS1-v1_5 は後方互換性のためにのみ保持され、新しいアプリケーションでは推奨されません
  • SHA-1 は既知の衝突攻撃のため、もはや推奨されません

互換性に関する注意事項​

各バージョン間で新しいスキームが導入されましたが、後方互換性のため:

  • v1.5スキームはすべてのバージョンでサポートされています
  • 新しく追加されたスキーム(OAEP、PSS)は古い実装と共存します
  • ASN.1構文は後方互換性を維持しています

Appendix E. About PKCS (PKCSについて)​

公開鍵暗号標準について (Public-Key Cryptography Standards)​

公開鍵暗号標準 (PKCS, Public-Key Cryptography Standards) は、RSA Laboratoriesが産業界および学術界の開発者と協力して策定した仕様であり、公開鍵暗号技術の展開を加速することを目的としています。

PKCSシリーズの概要​

PKCSシリーズは当初RSA Security Inc.(旧RSA Data Security, Inc.)によって開始され、複数の標準を含みます:

標準名称状態
PKCS #1RSA暗号仕様✅ 本文書 (RFC 8017)
PKCS #3Diffie-Hellman鍵交換標準-
PKCS #5パスワードベース暗号仕様RFC 2898, RFC 8018
PKCS #6拡張証明書構文標準廃止
PKCS #7暗号メッセージ構文標準RFC 2315 (CMSに置き換え)
PKCS #8秘密鍵情報構文仕様RFC 5208, RFC 5958
PKCS #9選択属性タイプRFC 2985
PKCS #10証明書要求構文仕様RFC 2986
PKCS #11暗号トークンインターフェース (Cryptoki)OASIS標準
PKCS #12個人情報交換構文標準RFC 7292
PKCS #15暗号トークン情報形式標準ISO/IEC 7816-15

PKCS #1の歴史的意義​

PKCS #1はPKCSシリーズの中で最も初期の、そして最も重要な標準の1つであり、RSA暗号の標準化された実装方法を定義しています:

  • 産業採用: PKCS #1はSSL/TLS、SSH、S/MIME、PGPなどのプロトコルで広く採用されています
  • 標準化への影響: IEEE 1363、ISO/IEC 18033などの国際標準に影響を与えました
  • 学術的貢献: OAEPおよびPSSスキームの導入は、証明可能に安全な暗号の発展を促進しました

RSA LabsからIETFへ​

2000年代中頃から、PKCSシリーズの標準は徐々にオープン標準組織に移管されました:

  • IETF: PKCS #1、#5、#7、#8、#9、#10、#12がRFCに転換
  • OASIS: PKCS #11 (Cryptoki) がOASIS標準に転換
  • ISO/IEC: PKCS #15がISO/IEC 7816標準に統合

本文書 (RFC 8017) は、PKCS #1の管理権がRSA LabsからIETFに移管されたことを表し、この標準の継続的な保守と発展を保証しています。

謝辞 (Acknowledgements)​

PKCS #1の発展は、暗号コミュニティからの多数の貢献のおかげです:

  • 原著者: Burt Kaliski, Jake Lacy
  • 理論的基礎: Mihir Bellare, Phillip Rogaway (OAEPおよびPSSスキーム)
  • v2.0-v2.2貢献者: Jakob Jonsson, Burt Kaliski, Kathleen Moriarty, Andreas Rusch
  • レビューとフィードバック: IETFコミュニティ、RSA Labs、学術界からの広範なレビュー

詳細情報​

  • IETF PKCSワーキンググループ: https://datatracker.ietf.org/wg/pkcs/
  • RSA Labs: http://www.rsa.com/rsalabs/
  • PKCSアーカイブ: https://www.emc.com/emc-plus/rsa-labs/standards-initiatives/pkcs.htm