| Generic | Example 1 | Example 2 | Example 3 | |
| 1. |
Curve:
G is Generation Point
n is prime
|
G = (5, 1)
n = 19
y2 = x3 + 2x + 2 (mod 17)
n • G = 0 19 (5, 1) = (0, 0) |
||
| 2. | Private Key: k |
= 5 | ||
| 3. |
Public Key:
K = k• G
Curve Point
|
= 5 • (5, 1)
= (9, 16)
|
||
| 4. | m = hash(message) | = 8 | ||
| 5. |
Ephemeral Private Key:
r
|
= 3 | ||
| 6. |
Ephemeral Public Key:
R = r • G
|
= 3 • (5, 1)
= (10, 6)
|
||
| 7. | rx | = 10 | ||
| 8. | s ≡ (m + k rx) r-1(mod n) |
≡ (8 + 5(10)) 317(mod 19)
≡ (8 + 50) 13 (mod 19)
≡ (58)(13) (mod 19)
≡ 754 (mod 19)
≡ 13 (mod 19)
|
||
| 9. | Signature: { rx, s } |
= { 10, 13 } |
var curve = new secp256k1(); // message hash var m = new BigInteger(847571); var r = new BigInteger(137239); // r = ephemeral instance for signature var R = curve.Multiply(r, curve.G); // R = ephemeral public key = (R_x, R_y) // private key var k = new BigInteger(359271); // public key var K = curve.Multiply(k, curve.G); // r value = signature part 1 of 2 var r_x = R.X; var k_r = (k * r); var m_k_r = BigInteger.ModPow(k_r + m, BigInteger.One, curve.n); var r_power = BigInteger.ModPow(r, curve.n - 2, curve.n); // signature factor = signature part 2 of 2 var s = BigInteger.ModPow(m_k_r * r_power, BigInteger.One, curve.n); // Public Key = K = (K_x, K_y) // Message Hash = m // Signature = (r_x, s)