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