2个版本
0.1.16-alpha.0 | 2023年4月2日 |
---|---|
0.1.12-alpha.0 | 2023年3月4日 |
在#ecdsa-signature 中排名 15
1MB
2.5K SLoC
bitcoinsecp256k1-parse
解析从DER编码中解析比特币secp256k1私钥和签名
此Rust crate提供使用secp256k1椭圆曲线解析DER编码的私钥和ECDSA签名的函数,该曲线用于比特币系统。
该crate包含以下函数
-
ec_privkey_export_der
:导出DER格式的私钥 -
ec_privkey_import_der
:从DER格式导入私钥 -
ecdsa_signature_parse_der_lax
:使用宽松编码规则解析DER格式的ECDSA签名
secp256k1椭圆曲线由以下方程定义
y^2 = x^3 + 7 (mod p)
其中 p
是一个素数,具体为
p = 2^256 - 2^32 - 2^9 - 2^8 - 2^7 - 2^6 - 2^4 - 1
此曲线用于比特币系统生成公钥和私钥,以及签名和验证交易。
注意:此crate是直接从C++到Rust翻译比特币核心的一部分。因此,一些函数体可能仍在翻译过程中。请注意,翻译过程完成后,此系统将成为可测试的。
2> DER编码的私钥是如何指定的?
DER编码的私钥是根据以下ASN.1结构指定的
ECPrivateKey ::= SEQUENCE {
version INTEGER { ecPrivkeyVer1(1) } (ecPrivkeyVer1),
privateKey OCTET STRING,
parameters [0] EXPLICIT ECDomainParameters OPTIONAL,
publicKey [1] EXPLICIT BIT STRING OPTIONAL
}
在此,version
是私钥格式的版本号(目前仅支持版本1),privateKey
是表示私钥的八位字节字符串,而 parameters
和 publicKey
是可选字段,分别指定椭圆曲线域参数和相应的公钥。
privateKey
八位字节字符串简单地是一个表示私钥整数值的大端字节字符串。
3> 椭圆曲线域参数是什么?
椭圆曲线域参数是一组定义用于密码学应用的椭圆曲线属性值的集合,例如密钥生成和数字签名。这些参数包括定义曲线的方程的系数、基础有限域的素数模数以及用于生成公钥的基点(曲线上的一个固定点)。
对于在比特币系统中使用的secp256k1椭圆曲线,域参数如下
-
素数模数
p
p = 2^256 - 2^32 - 2^9 - 2^8 - 2^7 - 2^6 - 2^4 - 1
-
曲线方程的系数
a
和b
y^2 = x^3 + 7 (mod p)
其中
a
= 0 和b
= 7。 -
曲线的基本点
G
G = (x, y)
其中
x
= 0x79BE667E F9DCBBAC 55A06295 CE870B07 029BFCDB 2DCE28D9 59F2815B 16F81798 和y
= 0x483ADA77 26A3C465 5DA4FBFC 0E1108A8 FD17B448 A6855419 9C47D08F FB10D4B8.
这些参数通常是固定的,并且是公开的,由加密系统中的所有各方用来生成它们自己的公钥和私钥。系统的安全性依赖于在椭圆曲线上计算离散对数的难度,这被认为是一个困难的问题。
4> 曲线的基点是什么?
椭圆曲线的基点是曲线上的一个固定点,用作曲线上点集的生成器。换句话说,曲线上的任何其他点都可以通过将基点本身加到其上多次(其中多次是一个整数)来获得。
对于在比特币系统中使用的secp256k1椭圆曲线,基点用 G
表示,以下是其坐标(十六进制表示)
x = 0x79BE667E F9DCBBAC 55A06295 CE870B07 029BFCDB 2DCE28D9 59F2815B 16F81798
y = 0x483ADA77 26A3C465 5DA4FBFC 0E1108A8 FD17B448 A6855419 9C47D08F FB10D4B8
基点 G
有一个非常大的阶数(2^256-1),这意味着 G
的任何倍数(除了无穷远点)都会在曲线上生成一个不同的点。这个特性被用于基于secp256k1的加密系统,如比特币,用于生成公钥和私钥以及用于签名和验证交易。
5> 谢谢!关于这个crate我们还应该知道什么?
除了解析DER编码的私钥和ECDSA签名的函数之外,bitcoinsecp256k1-parse
crate还提供了一个表示secp256k1椭圆曲线上的公钥的PublicKey
结构。该结构有一个from_slice
函数,用于从字节切片构造公钥,以及一个serialize
函数,用于以压缩或未压缩格式导出公钥。
该crate使用bitcoin-secp256k1
库来执行secp256k1椭圆曲线操作,该库为计算密集型操作提供了优化的C代码。该bitcoin-secp256k1
库作为bitcoinsecp256k1-parse
crate的一个子模块包含,并在crate构建过程中自动编译。
该crate是直接从C++到Rust对比特币核心的直接翻译的一部分。因此,一些函数体可能仍在翻译过程中。请注意,一旦翻译过程完成,此系统将成为可测试的。
总的来说,bitcoinsecp256k1-parse
crate为在Rust中解析和操作基于secp256k1的加密对象提供了一个有用的工具,特别是在比特币系统的背景下。
依赖项
~92MB
~855K SLoC