Openssl 魔法值?Secp256k1 和 ECDSA 的相似之處?secp256k1 有何特別之處?
第1部分:
執行此命令似乎是從比特幣的有效私鑰生成公鑰的可靠方法。這是一個正確的假設嗎?
openssl ec -inform DER -text -noout -in <(cat <(echo -n "302e0201010420") <(echo -n "PRIVATE_KEY_HEX_STRING") <(echo -n "a00706052b8104000a") | xxd -r -p) 2>/dev/null | tail -6 | head -5 | sed 's/[ :]//g' | tr -d '\n' && echo
這些神奇的價值:
302e0201010420
a00706052b8104000a
Openssl 似乎將這些值用於 DER 編碼規則,它似乎與 secp256k1 或比特幣沒有任何關係。這是一個正確的假設嗎?
第2部分:
從上述 openssl 命令中的私鑰派生公鑰時,似乎沒有在任何地方明確使用 y^2 = x^3 + 7 公式/secp256k1。
橢圓密碼學的所有公鑰實際上都是以相同的方式派生出來的……這意味著這些 ECDSA 曲線之間有大量重疊嗎?
與另一條 ECDSA 曲線相比,似乎比特幣唯一特定的東西是
FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE BAAEDCE6 AF48A03B BFD25E8C D0364141
.. 的私鑰的最大上限,這是一個正確的假設嗎?我如何能夠在不使用公式的情況下生成私鑰和公鑰?就像中本聰騙了我們一樣,這個公式沒有任何意義!如果有人能為我和另外兩個因此而無法入睡的人解決這個問題,這裡會有點困惑。
這些神奇的價值:
302e0201010420
a00706052b8104000a
Openssl 似乎將這些值用於 DER 編碼規則,它似乎與 secp256k1 或比特幣沒有任何關係。這是一個正確的假設嗎?
它們與比特幣無關,但我相信這些字節包含對 secp256k1 的引用(可能通過其 OID 1.3.132.0.10)。
具體來說,我認為這
8104000a
部分編碼了數字 132、0、10。橢圓密碼學的所有公鑰實際上都是以相同的方式派生出來的……這意味著這些 ECDSA 曲線之間有大量重疊嗎?
不,有很多相關參數進入公鑰計算:
- 其座標的欄位大小(secp256k1 為 2^256 - 2^32 - 977)
- 曲線的類型(Weierstrass、Edwards、扭曲的 Edwards…)
- 曲線方程的係數(對於較短的 Weierstrass 曲線,方程為 y^2 = x^3 + a*b + b;對於 secp256k1 a=0 和 b=7)。
- 生成器點(對應於私鑰 1 的點,必須按約定選擇)
- 生成器的階數(等於 secp256k1 曲線上的點數,但也可以少一點)
最後一項,生成器的順序,定義了有多少有效的私鑰。它被所有其他參數所暗示,但計算它是一個非平凡的計算,所以它通常是預先計算的。