Zum Hauptinhalt springen

9. Kodierungsmethoden für Signaturen mit Anhang (Encoding Methods for Signatures with Appendix)

Kodierungsmethoden werden verwendet, um eine Nachricht in eine kodierte Nachricht umzuwandeln, die dann durch RSA-Signaturprimitive signiert werden kann. Dieser Abschnitt spezifiziert zwei Kodierungsmethoden: EMSA-PSS und EMSA-PKCS1-v1_5.

9.1. EMSA-PSS

EMSA-PSS (Encoding Method for Signatures with Appendix - Probabilistic Signature Scheme) ist eine probabilistische Kodierungsmethode, die Zufälligkeit enthält und daher für eine gegebene Nachricht mehrere unterschiedliche kodierte Nachrichten erzeugen kann.

9.1.1. Kodierungsoperation (Encoding Operation)

EMSA-PSS-ENCODE (M, emBits)

Eingabe (Input):

  • M: zu kodierende Nachricht, eine Oktettzeichenkette beliebiger Länge
  • emBits: maximale Bitlänge der kodierten Nachricht, mindestens 8hLen + 8sLen + 9

Ausgabe (Output):

  • EM: kodierte Nachricht, eine Oktettzeichenkette der Länge emLen = ⌈emBits/8⌉

Schritte (Steps):

  1. Wenn die Länge von M größer ist als die Eingabegrenze der Hash-Funktion Hash (2^61 - 1 Oktette für SHA-1), Ausgabe "message too long" und Stopp.

  2. Sei mHash = Hash(M), eine Oktettzeichenkette der Länge hLen.

  3. Wenn emLen < hLen + sLen + 2, Ausgabe "encoding error" und Stopp.

  4. Erzeuge eine zufällige Oktettzeichenkette salt der Länge sLen.

  5. Sei M' = (0x)00 00 00 00 00 00 00 00 || mHash || salt ; M' ist eine Oktettzeichenkette der Länge 8 + hLen + sLen.

  6. Sei H = Hash(M'), eine Oktettzeichenkette der Länge hLen.

  7. Erzeuge eine Oktettzeichenkette PS, die aus emLen - sLen - hLen - 2 Null-Oktetten besteht.

  8. Sei DB = PS || 0x01 || salt ; DB ist eine Oktettzeichenkette der Länge emLen - hLen - 1.

  9. Sei dbMask = MGF(H, emLen - hLen - 1).

  10. Sei maskedDB = DB ⊕ dbMask.

  11. Setze die linkesten 8emLen - emBits Bits von maskedDB auf Null.

  12. Sei EM = maskedDB || H || 0xbc.

  13. Gebe EM aus.

9.1.2. Verifikationsoperation (Verification Operation)

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

Eingabe (Input):

  • M: Nachricht, eine Oktettzeichenkette beliebiger Länge
  • EM: zu verifizierende kodierte Nachricht, eine Oktettzeichenkette der Länge emLen = ⌈emBits/8⌉
  • emBits: maximale Bitlänge der kodierten Nachricht

Ausgabe (Output):

  • "consistent" (konsistent) oder "inconsistent" (inkonsistent)

Schritte: (Die Verifikationsschritte sind die Umkehrung der Kodierungsschritte und überprüfen alle Einschränkungen)

9.2. EMSA-PKCS1-v1_5

EMSA-PKCS1-v1_5 (Encoding Method for Signatures with Appendix - PKCS #1 v1.5) ist eine deterministische Kodierungsmethode, die für eine gegebene Nachricht immer die gleiche kodierte Nachricht erzeugt.

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

Eingabe (Input):

  • M: zu kodierende Nachricht, eine Oktettzeichenkette beliebiger Länge
  • emLen: erwartete Länge der kodierten Nachricht (in Oktetten), mindestens tLen + 11, wobei tLen die Oktettlänge des DigestInfo-Werts ist

Ausgabe (Output):

  • EM: kodierte Nachricht, eine Oktettzeichenkette der Länge emLen

Schritte (Steps):

  1. Wende die Hash-Funktion auf die Nachricht M an, um den Hash-Wert H zu erzeugen: H = Hash(M). Wenn die Hash-Funktion "message too long" ausgibt, Ausgabe "message too long" und Stopp.

  2. Unter Verwendung der Technik aus der Anmerkung in Abschnitt 9.2, kodiere den DigestInfo-Wert als T für die Hash-Funktion.

  3. Wenn emLen < tLen + 11, Ausgabe "intended encoded message length too short" und Stopp.

  4. Erzeuge eine Oktettzeichenkette PS, die aus emLen - tLen - 3 Oktetten mit dem Wert 0xff besteht.

  5. Konkateniere PS und andere Polsterung, um die kodierte Nachricht EM zu bilden: EM = 0x00 || 0x01 || PS || 0x00 || T

  6. Gebe EM aus.