Zum Hauptinhalt springen

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:

  1. Setze T auf die leere Sequenz. Die Länge von T (in Bits) wird als tlen bezeichnet, somit ist an diesem Punkt tlen = 0.

  2. Solange tlen < qlen, führe das Folgende aus:

    V = HMAC_K(V)
    T = T || V
  3. 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.

  4. 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.