Pebble Coding

ソフトウェアエンジニアによるIT技術、数学の備忘録

ruby rcdsa gemを用いたsecp256k1の鍵ペア生成

$ irb
irb(main):001:0> require 'ecdsa'
=> true
irb(main):002:0> require 'securerandom'
=> true
irb(main):003:0> group = ECDSA::Group::Secp256k1
=> #<ECDSA::Group:secp256k1>

法素数
irb(main):005:0> group.field.prime
=> 115792089237316195423570985008687907853269984665640564039457584007908834671663

ベースポイントのx座標
irb(main):006:0> group.generator.x
=> 55066263022277343669578718895168534326250603453777594175500187360389116729240

ベースポイントのy座標
irb(main):007:0> group.generator.y
=> 32670510020758816978083085130507043184471273380659243275938904335757337482424

群の位数
irb(main):008:0> group.order
=> 115792089237316195423570985008687907852837564279074904382605163141518161494337

秘密鍵生成
irb(main):009:0> privkey = 1 + SecureRandom.random_number(group.order-1)
=> 31932174844998617020519545778334124388425430302588218071507179824399413999474

>privkey.to_s(16)
=> "4698f87166219ad50731a43a61bcafbc52168b1965ed148cf63be3f76470f772"

公開鍵導出
irb(main):010:0> pubkey = group.generator.multiply_by_scalar(privkey)
=> #<ECDSA::Point: secp256k1, 0x3b26dff8e5cc352b036b119fec0e0f24e7355135cd94eda4c457be2f4317939d, 
0xfd015986045bff45746ef9c716dfa66f9ea9a09f85dfc704d021cd32443ecf60>

公開鍵のx座標
irb(main):011:0> pubkey.x
=> 26755144054576924229872070338383934509238382349899682642883476599488663491485

公開鍵のy座標
irb(main):012:0> pubkey.y
=> 114437535407147987001672943056342111150865668978537454145423922350647379152736

こちらの値と同じで正しく取得できていることが分かります。 secp256k1仕様 - Pebble Coding