3. Deterministic DSA and ECDSA (Deterministisches DSA und ECDSA)
3. Deterministic DSA and ECDSA (Deterministisches DSA und ECDSA)
Deterministisches (EC)DSA ist der Prozess der Erzeugung einer (EC)DSA-Signatur über einer Eingabenachricht m durch Verwendung des standardmäßigen (EC)DSA-Signaturerzeugungsprozesses (diskutiert im vorherigen Abschnitt), außer dass der Wert k, anstatt zufällig erzeugt zu werden, durch den in diesem Abschnitt beschriebenen Prozess erhalten wird.
Wir verwenden die in Abschnitt 2 beschriebenen Notationen.
3.1. Building Blocks (Bausteine)
3.1.1. HMAC
HMAC [RFC2104] ist eine Konstruktion eines Message Authentication Code unter Verwendung einer Hash-Funktion und eines geheimen Schlüssels. Hier verwenden wir HMAC mit derselben Hash-Funktion H wie derjenigen, die zur Verarbeitung der Eingabenachricht vor der Signaturerzeugung oder -verifizierung verwendet wird.
Wir bezeichnen den Prozess der Anwendung von HMAC mit Schlüssel K auf Daten V durch:
HMAC_K(V)
was eine Sequenz von Bits der Länge hlen zurückgibt (die Ausgabelänge der zugrunde liegenden Hash-Funktion H).
3.2. Generation of k (Erzeugung von k)
Bei der Eingabenachricht m wird der folgende Prozess angewendet:
a. Verarbeite m durch die Hash-Funktion H, was ergibt:
h1 = H(m)
(h1 ist eine Sequenz von hlen Bits).
b. Setze:
V = 0x01 0x01 0x01 ... 0x01
sodass die Länge von V in Bits gleich 8*ceil(hlen/8) ist. Zum Beispiel wird auf einem oktetbasierten System, wenn H SHA-256 ist, V auf eine Sequenz von 32 Oktetten mit dem Wert 1 gesetzt. Beachten Sie, dass wir in diesem Schritt und allen folgenden Schritten dieselbe H-Funktion wie die in Schritt 'a' zur Verarbeitung der Eingabenachricht verwendete verwenden. Diese Wahl wird in Abschnitt 3.6 ausführlicher diskutiert.
c. Setze:
K = 0x00 0x00 0x00 ... 0x00
sodass die Länge von K in Bits gleich 8*ceil(hlen/8) ist.
d. Setze:
K = HMAC_K(V || 0x00 || int2octets(x) || bits2octets(h1))
wobei '||' Verkettung bezeichnet. Mit anderen Worten, wir berechnen HMAC mit Schlüssel K über die Verkettung des Folgenden in dieser Reihenfolge: der aktuelle Wert von V, eine Sequenz von acht Bits mit dem Wert 0, die Kodierung des (EC)DSA-privaten Schlüssels x und die gehashte Nachricht (möglicherweise gekürzt und erweitert wie durch die bits2octets-Transformation spezifiziert). Das HMAC-Ergebnis ist der neue Wert von K. Beachten Sie, dass der private Schlüssel x im Bereich [1, q-1] liegt, daher eine korrekte Eingabe für int2octets ist, was rlen Bits Ausgabe ergibt, d.h. eine ganzzahlige Anzahl von Oktetten (rlen ist ein Vielfaches von 8).
e. Setze:
V = HMAC_K(V)
f. Setze:
K = HMAC_K(V || 0x01 || int2octets(x) || bits2octets(h1))
Beachten Sie, dass das "interne Oktett" diesmal 0x01 ist.
g. Setze:
V = HMAC_K(V)
h. Wende den folgenden Algorithmus an, bis ein geeigneter Wert für k gefunden wird:
-
Setze T auf die leere Sequenz. Die Länge von T (in Bits) wird als tlen bezeichnet, somit ist an diesem Punkt tlen = 0.
-
Solange tlen < qlen, führe das Folgende aus:
V = HMAC_K(V)
T = T || V -
Berechne:
k = bits2int(T)Wenn dieser Wert für k geeignet ist (d.h. wenn k im Bereich [1, q-1] liegt und für DSA oder ECDSA geeignet ist), dann wird dieser Wert von k verwendet.
-
Andernfalls berechne:
K = HMAC_K(V || 0x00)
V = HMAC_K(V)und kehre zu Schritt h.1 zurück, wobei versucht wird, einen neuen Wert für k zu erzeugen.