所有可能的 EC 私鑰都有效嗎?
我通常使用 OpenSSL 或 Bouncy Castle 生成密鑰對。
我正在使用曲線
secp256k1
。256 位私鑰看起來相當隨機。
“私鑰”的所有值是否都有對應的公鑰?
如果是這樣,當將它們視為私鑰時,是否可以找到所有任意 256 位值的公鑰?
如果不是,有沒有辦法判斷 256 位值是否可以是私鑰?
我認為您使用的是每個 ANS X9.62:2005 的 256 位曲線。
並非所有 256 位位串都是正式有效的私鑰;當使用 big-endian 約定時,這些必須表示一個嚴格的正整數,小於 $ n $ ,最大素數階子群的階數。引用標準中的規範性 A.4.1 前言:
給定橢圓曲線域參數的橢圓曲線密鑰對是一對 $ (d, Q) $ , 在哪裡 $ d $ 是一個整數 $ [1, n – 1] $ , Q 是曲線上的一個點,使得 $ Q = d,G $ .
對於SEC 2的Koblitz 曲線
secp256k1
,$ n=2^{256}-\mathtt{14551231950b75fc4402da1732fc9bebf}_{16} $ .
For P-256 (also known as
secp256r1
),$ n=2^{256}-2^{224}+2^{192}-\mathtt{4319055258e8617b0c46353d039cdaaf}_{16} $ .
The all-zero bitstring, and the bitstrings representing $ n $ or more in big-endian convention, have no corresponding public key per the standard. They are in a proportion about $ 2^{-128} $ for
secp256k1
, $ 2^{-32} $ for P-256.Note: we could reduce modulo $ n $ bitstrings representing more than $ n $ , but that would be non-standard, and would still leave two bitstring (corresponding to $ 0 $ and $ n $ ) without a public key. $ k\gets((k+n-2)\bmod(n-1))+1 $ would do better, but the distribution would not be uniform unless $ k $ is drawn at random from an interval much larger than $ n $ .
Note: This answer disregards the ASN.1 representation of a private key.