Zum Hauptinhalt springen

A.1. 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. 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. 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. 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