ECDSA Signing

GenericExample 1Example 2Example 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 = kG
Curve Point
= 5(5, 1)
= (9, 16)
4. m = hash(message) = 8
5.
Ephemeral Private Key:
r
= 3
6.
Ephemeral Public Key:
R = rG
= 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)