在secp256k1 曲线的离散对数问题中,我其实很好奇生成点和公钥将如何实现(理由是参数有两个版本)。
我想知道公钥和生成器点是否应该应用“使用“<code>02”或“<code>03”压缩或使用“<code>04”未压缩。
我在任何地方都找不到任何答案。
在secp256k1 曲线的离散对数问题中,我其实很好奇生成点和公钥将如何实现(理由是参数有两个版本)。
我想知道公钥和生成器点是否应该应用“使用“<code>02”或“<code>03”压缩或使用“<code>04”未压缩。
我在任何地方都找不到任何答案。
前缀“02”、“03”、“04”表示点的压缩类型。
“04”表示该点未压缩,即x和y坐标都以这种形式指定。“02”和“03”表示该点被压缩。此表示中仅存在 x 坐标。y 坐标可以从 x 坐标计算(通过求解y^2 = x^3 + ax + b (mod n)
)。因为 y 有 2 个可能的值,所以“02”表示正值,“03”表示负值。(负数实际上并不是负数,因为我们使用的是模运算)。
例如对于 secp256k1,我们有 -
Gx = 79BE667E F9DCBBAC 55A06295 CE870B07 029BFCDB 2DCE28D9 59F2815B 16F81798
Gy = 483ADA77 26A3C465 5DA4FBFC 0E1108A8 FD17B448 A6855419 9C47D08F FB10D4B8
// Which can be written as
G_compressed = 02 79BE667E F9DCBBAC 55A06295 CE870B07 029BFCDB 2DCE28D9 59F2815B 16F81798
G_uncompressed = 04 79BE667E F9DCBBAC 55A06295 CE870B07 029BFCDB 2DCE28D9 59F2815B 16F81798 483ADA77 26A3C465 5DA4FBFC 0E1108A8 FD17B448 A6855419 9C47D08F FB10D4B8
在内部,这两种形式都代表同一个点,即
x = 55066263022277343669578718895168534326250603453777594175500187360389116729240
y = 32670510020758816978083085130507043184471273380659243275938904335757337482424
顺便说一句,这与离散日志问题无关。