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):
-
長さチェック: Lの長さがマスク生成関数の入力制限(2^61 - 1オクテット)を超える場合、"label too long" を出力して停止します。
-
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
-
RSA暗号化:
- エンコードされたメッセージEMを整数メッセージ代表値mに変換します: m = OS2IP(EM)
- RSAEP暗号化プリミティブを適用します: c = RSAEP((n, e), m)
- 暗号文代表値cを長さkの暗号文Cに変換します: C = I2OSP(c, k)
-
暗号文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):
-
長さチェック: Lの長さが入力制限を超える場合、"decryption error" を出力して停止します。暗号文Cの長さがkオクテットでない場合(またはk < 2hLen + 2の場合)、"decryption error" を出力して停止します。
-
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)
-
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" を出力して停止します。
-
メッセージ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選択暗号文攻撃を防ぐために、異なるタイプのエラーを区別してはなりません。