Zum Hauptinhalt springen

Appendix A. Examples (Beispiele)

Appendix A. Examples (Beispiele)

A.1. Detailed Example (Detailliertes Beispiel)

Wir detaillieren hier die Zwischenwerte, die während der Erzeugung von k für eine Beispielnachricht und einen Beispielschlüssel erhalten werden. Wir verwenden eine binäre Kurve, da diese spezifische Kurve standardmäßig ist und eine Gruppenordnungslänge (qlen) hat, die kein Vielfaches von 8 ist. Dies veranschaulicht die feinen Details, wie Konvertierungen zwischen Ganzzahlen und Bit-Sequenzen durchgeführt werden.

A.1.1. Key Pair (Schlüsselpaar)

Wir betrachten ECDSA auf der Kurve K-163, die in [FIPS-186-4] beschrieben ist (auch bekannt als "ansix9t163k1" in [X9.62]). Die Kurve ist über einem Körper GF(2^163) definiert: Körperelemente werden in 163-Bit-Zeichenfolgen kodiert. Die Ordnung des konventionellen Basispunkts ist der Primwert:

q = 0x4000000000000000000020108A2E0CC0D99F8A5EF

der die Länge qlen = 163 Bits hat.

Unser privater Schlüssel ist:

x = 0x09A4D6792295A7F730FC3F2B49CBC0F62E862272F

Der entsprechende öffentliche Schlüssel ist der Kurvenpunkt U = xG. Dieser Punkt hat zwei Koordinaten, die Elemente des Körpers GF(2^163) sind. Diese Elemente können unter Verwendung des in Abschnitt A.5.6 von [X9.62] beschriebenen Verfahrens in Ganzzahlen konvertiert werden, was die zwei öffentlichen Punktkoordinaten ergibt:

Ux = 0x79AEE090DB05EC252D5CB4452F356BE198A4FF96F
Uy = 0x782E29634DDC9A31EF40386E896BAA18B53AFA5A3

A.1.2. Generation of k (Erzeugung von k)

In diesem Beispiel verwenden wir die Hash-Funktion SHA-256 [FIPS-180-4]. Die Eingabenachricht ist die UTF-8-Kodierung der Zeichenfolge "sample" (6 Oktette, d.h. 48 Bits).

Die gehashte Eingabenachricht h1 = SHA-256(m) ist:

h1
AF 2B DB E1 AA 9B 6E C1 E2 AD E1 D6 94 F4 1F C7
1A 83 1D 02 68 E9 89 15 62 11 3D 8A 62 AD D1 BF

(32 Oktette; jeder Oktettwert ist in hexadezimaler Notation aufgeführt).

Wir konvertieren den privaten Schlüssel x unter Verwendung der int2octets-Transformation in eine Sequenz von Oktetten:

int2octets(x)
00 9A 4D 67 92 29 5A 7F 73 0F C3 F2 B4 9C BC 0F
62 E8 62 27 2F

Hinweis: Obwohl der spezifische Wert von x numerisch in 160 Bits, d.h. 20 Oktette, passen würde, kodieren wir x dennoch in 21 Oktette, da die Kodierungslänge durch die Länge von q, die 163 Bits beträgt, bestimmt wird.

Wir kürzen und/oder erweitern auch die gehashte Nachricht unter Verwendung von bits2octets:

bits2octets(h1)
01 79 5E DF 0D 54 DB 76 0F 15 6D 0D AC 04 C0 32
2B 3A 20 42 24

Die Schritte b bis g (siehe Abschnitt 3.2) berechnen dann die Werte für die K- und V-Variablen. Diese Variablen sind Sequenzen von 256 Bits (die Ausgabelänge der Hash-Funktion, aufgerundet auf ein Vielfaches von 8). Wir reproduzieren hier die aufeinanderfolgenden Werte:

V nach Schritt b:

01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01

K nach Schritt c:

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

K nach Schritt d:

09 99 9A 9B FE F9 72 D3 34 69 11 88 3F AD 79 51
D2 3F 2C 8B 47 F4 20 22 2D 11 71 EE EE AC 5A B8

V nach Schritt e:

D5 F4 03 0F 75 5E E8 6A A1 0B BA 8C 09 DF 11 4F
F6 B6 11 1C 23 85 00 D1 3C 73 43 A8 C0 1B EC F7

K nach Schritt f:

0C F2 FE 96 D5 61 9C 9E F5 3C B7 41 7D 49 D3 7E
A6 8A 4F FE D0 D7 E6 23 E3 86 89 28 99 11 BD 57

V nach Schritt g:

78 34 57 C1 CF 31 48 A8 F2 A9 AE 73 ED 47 2F A9
8E D9 CD 92 5D 8E 96 4C E0 76 4D EF 3F 84 2B 9A

In Schritt h führen wir die finale Schleife durch. Da wir HMAC mit SHA-256 verwenden, das 256 Bits Ausgabe erzeugt, und wir nur 163 Bits für T benötigen, ergibt ein einzelner HMAC-Aufruf das folgende T:

T (erster Versuch):

93 05 A4 6D E7 FF 8E B1 07 19 4D EB D3 FD 48 AA
20 D5 E7 65 6C BE 0E A6 9D 2A 8D 4E 7C 67 31 4A

was, wenn mit bits2int in eine Ganzzahl konvertiert, einen ersten Kandidaten für k ergibt:

k1 = 0x4982D236F3FFC758838CA6F5E9FEA455106AF3B2B

Da dieser Wert größer als q-1 ist, müssen wir schleifen. Dies beinhaltet zuerst die Berechnung neuer Werte für K und V:

neues K:

75 CB 5C 05 B2 A7 8C 3D 81 DF 12 D7 4D 7B E0 A0
E9 4A B1 98 15 78 1D 4D 8E 29 02 A7 9D 0A 66 99

neues V:

DC B9 CA 12 61 07 A9 C2 7C E7 7B A5 8E A8 71 C8
C9 12 D8 35 EA DD C3 05 F2 44 5D 88 F6 6C 4C 43

Ein neuer Aufruf von HMAC_K(V) ergibt dann:

T (zweiter Versuch):

5C 51 E5 75 31 DA 57 0D 21 31 15 1E 44 05 1B 37
9A 2D EA 30 18 5F 7D FA FD B3 3A D1 85 8C 02 3D

was in eine Ganzzahl konvertiert wird:

k = 0x23AF4074C90A02B3FE61D286D5C87F425E6BDD81B

Dieser Wert ist im Bereich [1, q-1] und ist daher geeignet.

A.1.3. Signature (Signatur)

Mit dem oben erzeugten k-Wert wird die Signatur wie in Abschnitt 2.4 beschrieben berechnet. Die endgültige Signatur über die Nachricht "sample" mit dem gegebenen Schlüssel ist:

r = 0x113A63990598A3828C407C0F4D2438D990DF99A7F
s = 0x1313A2E03F5412DDB296A22E2C455335545672D9F

A.2. Test Vectors (Testvektoren)

Die folgenden Unterabschnitte enthalten Testvektoren für verschiedene Kombinationen von DSA/ECDSA und Hash-Funktionen. Für jeden Test wird ein Schlüsselpaar erzeugt, und die Signatur wird für zwei Beispielnachrichten berechnet:

  • Die Zeichenfolge "sample"
  • Die Zeichenfolge "test"

Für jeden Fall werden die resultierenden r- und s-Werte der Signatur angegeben.

Die vollständigen Testvektoren für alle aufgeführten Kurven und Hash-Funktionen sind im Original-RFC-Dokument enthalten und sollten für Implementierungstests konsultiert werden.

A.3. Sample Code (Beispielcode)

Beispielimplementierungen des in diesem Dokument beschriebenen Algorithmus sind verfügbar. Implementierer werden ermutigt, ihre Implementierungen gegen die in diesem Anhang bereitgestellten Testvektoren zu testen, um die Korrektheit sicherzustellen.