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

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を出力します。