Public-Key

如何使用 OpenSSL / Bash 壓縮公鑰

  • January 7, 2022

我在 Shell 中生成私鑰和公鑰,如下所示:

openssl ecparam -name secp256k1 -rand /dev/random -genkey -noout -out private-key.pem
openssl ec -in private-key.pem -outform DER | tail -c +8 | head -c 32 | xxd -p -c 32 > bitcoin_private_key.pem
openssl ec -in private-key.pem -pubout -outform DER | tail -c 65 | xxd -p -c 65 > bitcoin_public_key.pem

然後我可以用以下方式獲取公鑰 X:

head -c 66 bitcoin_public_key.pem | tail -c 64

Y 的最後一個字節是:

tail -c 3 bitcoin_public_key.pem

壓縮的公鑰必須0x02 + X用於最後一個偶數字節Y0x03 + X奇數字節。

如何檢查最後一個 Y 的字節是奇數還是偶數?

您可以讓 OpenSSL 執行此操作,而不是“手動”壓縮:

openssl ec -in privatekey.pem -pubout -conv_form compressed -outform der | tail -c 33 | xxd -p -c 33 >compressedpub.hex

.pem通常用於表示 PEM 格式,而您創建​​的文件完全不是 PEM 格式或以任何方式 PEM 格式,所以這非常容易誤導和混淆。我在範例中使用了 .hex,但還有其他合理的可能性。

您只需檢查 Y 是否可被 2 整除(即 Y % 2 == 0)。這是預設的奇偶校驗概念……

引用自:https://bitcoin.stackexchange.com/questions/111636