Ruby sign secp256k1 + 簽章與加解密心得

單純工作需求使用,因為有些"特殊" API 會需要 secp256k1 + sha256 或 Java 的 SHA256withECDSA… 嘛,反正把 demo code 丟在這邊唄

# build and install first : https://github.com/bitcoin/secp256k1
# gem install : `gem i secp256k1-ruby` #  from : https://github.com/Yamaguchi/secp256k1-ruby

require "secp256k1"
require "awesome_print"
require "securerandom"

privkey_source = SecureRandom.hex(64 / 2) # replace here for 32 bytes (len=64) hex priv_key
data = "testme"
privkey = Secp256k1::PrivateKey.new(privkey:[privkey_source].pack("H*"))
signture_hex = privkey.ecdsa_serialize_compact(privkey.ecdsa_sign(data)).unpack("H*")[0]
puts signture_hex

該 gem 其實寫得很難理解,畢竟有過 FFI,不過拿 ruby 的 source code 去推敲變數名稱與關聯性,大概還是能推出來之類的,最終結果就是上面這樣了

演算法系列在 Ruby 上其實很常用 pack("H*")unpack("H*")[0] 其實就是 binary 和 hex 的轉換而已,心中有 binary 和 hex 的差別,基本上就很難走錯路就是(所以要先搞清楚 input / output 的是 binary 還是 hex,不行都試試看)

再來就是不管如何都要確認 key 的長度,類似輸入一個 private key 後,必須再把 obj 內的 private key 印出來看看,因為類似 OpenSSL 系列都會轉過,出現不一樣時就代表你的 private key 格式可能有錯之類的

最終就是檢查結果的長度,如果回傳的是 binary 則轉 hex 看看,而有些 signture 可能是中間值(不定長度),如果 demo code 最終是 fix size 就可以再轉一次 md5 / sha1 / sha256 / sha512 看看(這些演算法最終結果的長度都不一樣)

而有些演算法類似 RSA … 基本上每次簽結果應該都不一樣才是,這時候就可能請對方提供 test server 才會好一點,否則都會需要關落陰唄 …

大概這樣唄,這是簽過 … 一大票 API server 的心得 … 包括 midi / B2B / HSM / 各銀行callback / 第三方 / 信用卡 / 區塊鏈 raw data / 加密通訊協定 / 自幹 redius server … 後的心得就是了 … 回首就是那麼多了,還都不提供 Ruby 的 SDK 的,都要從頭自幹才行 … 哈哈||||