cryptography – How is the generator level G chosen within the secp256k1 curve utilized in Bitcoin?

0
11
cryptography – How is the generator level G chosen within the secp256k1 curve utilized in Bitcoin?


As Pieter already described in his reply it isn’t identified why the multiplicative inverse of two of the generator level of secp256k1 is such a brief (166 bit) quantity.

However curiously all prime order koblitz curves of the SEC 2 household (secp160k1, secp192k1, secp224k1, secp256k1) share this uncommon property.

Furthermore all these quick x-coordinates of those supply factors share a big quantity of their bits (152 bits for all these x-values are the identical):

secp160k1:         0x4_8ce563f89a0ed9414f5aa28ad0d96d6795f9c6_2
secp192k1:  0x554123b7_8ce563f89a0ed9414f5aa28ad0d96d6795f9c6_6
secp224k1:       0x3b7_8ce563f89a0ed9414f5aa28ad0d96d6795f9c6_3
secp256k1:       0x3b7_8ce563f89a0ed9414f5aa28ad0d96d6795f9c6_3

(I inserted the _ to visualise the equivalent half within the numbers.)

So possibly again within the 90s somebody at Certicom hashed one thing right into a 160 bit hash after which determined to exchange the primary and the final 4 bits per curve (and added a prefix worth for 3 of them)?

Who is aware of? It is an fascinating thriller. 🙂

I can extremely advocate this quick discuss from Nadia Heninger about this subject:
https://www.youtube.com/watch?v=NGLR2N4EK58

Edit:

To confirm this your self in Sage (instance for secp192k1, merely change curve parameters for the opposite secp…k1 curves):

# outline the curve from parameters
sage: prime_p = ZZ('0xfffffffffffffffffffffffffffffffffffffffeffffee37')
sage: a = 0
sage: b = 3

sage: secp192k1 = EllipticCurve( GF(prime_p), [a, b] )
sage: order_n = secp192k1.order()  # get order of the curve

# generator level G
sage: G = secp192k1.level(('0xdb4ff10ec057e9ae26b07d0280b7f4341da5d1b1eae06c7d' , '0x9b2f2f6d9c5628a7844163d015be86344082aa88d95e2f9d'))

# multiply with multiplicative inverse of two:
sage: Point_half_G_mod_n = G *  ZZ( 1 / GF(order_n)(2) )

# print coordinates in hex:
sage: 'x: %x, y: %x'  %( Point_half_G_mod_n.xy() )
'x: 554123b78ce563f89a0ed9414f5aa28ad0d96d6795f9c66, y: 90755fc93ea4b13027fc6c8f337d92c6d00090fad0e8b2c6'

LEAVE A REPLY

Please enter your comment!
Please enter your name here