5. Kryptographische Primitive (Cryptographic Primitives)
Kryptographische Primitive (Cryptographic Primitives) sind grundlegende mathematische Operationen, aus denen kryptographische Schemata aufgebaut werden können. Sie sind für den Einsatz in Hardwareimplementierungen oder als Softwaremodule vorgesehen und sollen nicht unabhängig von Schemata Sicherheit bieten.
Dieses Dokument spezifiziert vier Typen von Primitiven, die paarweise organisiert sind: Verschlüsselung und Entschlüsselung (Encryption and Decryption); Signatur und Verifikation (Signature and Verification).
Die Spezifikation der Primitive geht davon aus, dass die Eingaben bestimmte Bedingungen erfüllen, insbesondere dass die öffentlichen und privaten RSA-Schlüssel gültig sind.
5.1. Verschlüsselungs- und Entschlüsselungsprimitive (Encryption and Decryption Primitives)
Ein Verschlüsselungsprimitiv (Encryption Primitive) erzeugt einen Chiffretextrepräsentanten aus einem Nachrichtenrepräsentanten unter der Kontrolle eines öffentlichen Schlüssels, und ein Entschlüsselungsprimitiv (Decryption Primitive) stellt einen Nachrichtenrepräsentanten aus einem Chiffretextrepräsentanten unter der Kontrolle des entsprechenden privaten Schlüssels wieder her.
Ein Paar von Verschlüsselungs- und Entschlüsselungsprimitiven wird in den in diesem Dokument definierten Verschlüsselungsschemata verwendet und wird hier spezifiziert: RSA-Verschlüsselungsprimitiv (RSAEP, RSA Encryption Primitive) / RSA-Entschlüsselungsprimitiv (RSADP, RSA Decryption Primitive). RSAEP und RSADP beinhalten dieselbe mathematische Operation, mit unterschiedlichen Schlüsseln als Eingabe. Die hier definierten Primitive sind identisch mit dem Ganzzahlfaktorisierungs-Verschlüsselungsprimitiv mit RSA (IFEP-RSA) / Ganzzahlfaktorisierungs-Entschlüsselungsprimitiv mit RSA (IFDP-RSA) in IEEE 1363 [IEEE1363] (außer dem Hinzufügen der Unterstützung für Multi-Prim-RSA) und sind kompatibel mit PKCS #1 v1.5.
Die Hauptoperation in jedem Primitiv ist die Exponentiation (Exponentiation).
5.1.1. RSAEP
RSAEP ((n, e), m)
Eingabe (Input)
(n, e) öffentlicher RSA-Schlüssel
m Nachrichtenrepräsentant, eine ganze Zahl zwischen 0 und n - 1
Ausgabe (Output)
c Chiffretextrepräsentant, eine ganze Zahl zwischen 0 und n - 1
Fehler (Error)
"message representative out of range" (Nachrichtenrepräsentant außerhalb des Bereichs)
Annahme (Assumption)
Der öffentliche RSA-Schlüssel (n, e) ist gültig
Schritte (Steps)
Schritt 1. Wenn der Nachrichtenrepräsentant m nicht zwischen 0 und n - 1 liegt, Ausgabe "message representative out of range" und Stopp.
Schritt 2. Sei c = m^e mod n.
Schritt 3. Gebe c aus.
5.1.2. RSADP
RSADP (K, c)
Eingabe (Input)
K privater RSA-Schlüssel, wobei K eine der folgenden Formen hat:
- Paar (n, d)
- Quintupel (p, q, dP, dQ, qInv) und möglicherweise leere Sequenz von Tripeln (r_i, d_i, t_i), i = 3, ..., u
c Chiffretextrepräsentant, eine ganze Zahl zwischen 0 und n - 1
Ausgabe (Output)
m Nachrichtenrepräsentant, eine ganze Zahl zwischen 0 und n - 1
Fehler (Error)
"ciphertext representative out of range" (Chiffretextrepräsentant außerhalb des Bereichs)
Annahme (Assumption)
Der private RSA-Schlüssel K ist gültig
Schritte (Steps)
Schritt 1. Wenn der Chiffretextrepräsentant c nicht zwischen 0 und n - 1 liegt, Ausgabe "ciphertext representative out of range" und Stopp.
Schritt 2. Der Nachrichtenrepräsentant m wird wie folgt berechnet:
a. Wenn die erste Form von K (n, d) verwendet wird, sei m = c^d mod n.
b. Wenn die zweite Form von K (p, q, dP, dQ, qInv) und (r_i, d_i, t_i) verwendet wird, gehe wie folgt vor:
i. Sei m_1 = c^dP mod p und m_2 = c^dQ mod q.
ii. Wenn u > 2, sei m_i = c^(d_i) mod r_i, i = 3, ..., u.
iii. Sei h = (m_1 - m_2) * qInv mod p.
iv. Sei m = m_2 + q * h.
v. Wenn u > 2, sei R = r_1 und für i = 3 bis u, führe aus:
- Sei R = R * r_(i-1).
- Sei h = (m_i - m) * t_i mod r_i.
- Sei m = m + R * h.
Schritt 3. Gebe m aus.
Hinweis: Schritt 2.b kann als einzelne Schleife umgeschrieben werden, vorausgesetzt, die Reihenfolge von p und q wird umgekehrt. Für die Konsistenz mit PKCS #1 v2.0 werden jedoch die ersten beiden Primzahlen p und q getrennt von den zusätzlichen Primzahlen behandelt.
5.2. Signatur- und Verifikationsprimitive (Signature and Verification Primitives)
Ein Signaturprimitiv (Signature Primitive) erzeugt einen Signaturrepräsentanten aus einem Nachrichtenrepräsentanten unter der Kontrolle eines privaten Schlüssels, und ein Verifikationsprimitiv (Verification Primitive) stellt einen Nachrichtenrepräsentanten aus einem Signaturrepräsentanten unter der Kontrolle des entsprechenden öffentlichen Schlüssels wieder her. Ein Paar von Signatur- und Verifikationsprimitiven wird in den in diesem Dokument definierten Signaturschemata verwendet und wird hier spezifiziert: RSA-Signaturprimitiv Version 1 (RSASP1, RSA Signature Primitive, version 1) / RSA-Verifikationsprimitiv Version 1 (RSAVP1, RSA Verification Primitive, version 1).
Die hier definierten Primitive sind identisch mit dem Ganzzahlfaktorisierungs-Signaturprimitiv mit RSA Version 1 (IFSP-RSA1) / Ganzzahlfaktorisierungs-Verifikationsprimitiv mit RSA Version 1 (IFVP-RSA1) in IEEE 1363 [IEEE1363] (außer dem Hinzufügen der Unterstützung für Multi-Prim-RSA) und sind kompatibel mit PKCS #1 v1.5.
Die Hauptoperation in jedem Primitiv ist die Exponentiation, wie in den Verschlüsselungs- und Entschlüsselungsprimitiven in Abschnitt 5.1. RSASP1 und RSAVP1 sind identisch mit RSADP und RSAEP, außer den Namen der Eingabe- und Ausgabeparameter; sie werden unterschieden, weil sie für unterschiedliche Zwecke verwendet werden.
5.2.1. RSASP1
RSASP1 (K, m)
Eingabe (Input)
K privater RSA-Schlüssel, wobei K eine der folgenden Formen hat:
- Paar (n, d)
- Quintupel (p, q, dP, dQ, qInv) und möglicherweise leere Sequenz von Tripeln (r_i, d_i, t_i), i = 3, ..., u
m Nachrichtenrepräsentant, eine ganze Zahl zwischen 0 und n - 1
Ausgabe (Output)
s Signaturrepräsentant, eine ganze Zahl zwischen 0 und n - 1
Fehler (Error)
"message representative out of range" (Nachrichtenrepräsentant außerhalb des Bereichs)
Annahme (Assumption)
Der private RSA-Schlüssel K ist gültig
Schritte (Steps)
Schritt 1. Wenn der Nachrichtenrepräsentant m nicht zwischen 0 und n - 1 liegt, Ausgabe "message representative out of range" und Stopp.
Schritt 2. Der Signaturrepräsentant s wird wie folgt berechnet:
a. Wenn die erste Form von K (n, d) verwendet wird, sei s = m^d mod n.
b. Wenn die zweite Form von K (p, q, dP, dQ, qInv) und (r_i, d_i, t_i) verwendet wird, gehe wie folgt vor:
- Sei s_1 = m^dP mod p und s_2 = m^dQ mod q.
- Wenn u > 2, sei s_i = m^(d_i) mod r_i, i = 3, ..., u.
- Sei h = (s_1 - s_2) * qInv mod p.
- Sei s = s_2 + q * h.
- Wenn u > 2, sei R = r_1 und für i = 3 bis u, führe aus:
- a. Sei R = R * r_(i-1).
- b. Sei h = (s_i - s) * t_i mod r_i.
- c. Sei s = s + R * h.
Schritt 3. Gebe s aus.
Hinweis: Schritt 2.b kann als einzelne Schleife umgeschrieben werden, vorausgesetzt, die Reihenfolge von p und q wird umgekehrt. Für die Konsistenz mit PKCS #1 v2.0 werden jedoch die ersten beiden Primzahlen p und q getrennt von den zusätzlichen Primzahlen behandelt.
5.2.2. RSAVP1
RSAVP1 ((n, e), s)
Eingabe (Input)
(n, e) öffentlicher RSA-Schlüssel
s Signaturrepräsentant, eine ganze Zahl zwischen 0 und n - 1
Ausgabe (Output)
m Nachrichtenrepräsentant, eine ganze Zahl zwischen 0 und n - 1
Fehler (Error)
"signature representative out of range" (Signaturrepräsentant außerhalb des Bereichs)
Annahme (Assumption)
Der öffentliche RSA-Schlüssel (n, e) ist gültig
Schritte (Steps)
Schritt 1. Wenn der Signaturrepräsentant s nicht zwischen 0 und n - 1 liegt, Ausgabe "signature representative out of range" und Stopp.
Schritt 2. Sei m = s^e mod n.
Schritt 3. Gebe m aus.