5个版本

0.1.16-alpha.02023年3月31日
0.1.14-alpha.02023年3月18日
0.1.13-alpha.02023年3月17日
0.1.12-alpha.02023年1月19日
0.1.10-alpha.02023年1月18日

#10 in #ecdh

Download history 237/week @ 2024-03-30 132/week @ 2024-04-06 207/week @ 2024-04-13 164/week @ 2024-04-20 161/week @ 2024-04-27 159/week @ 2024-05-04 209/week @ 2024-05-11 129/week @ 2024-05-18 163/week @ 2024-05-25 164/week @ 2024-06-01 91/week @ 2024-06-08 141/week @ 2024-06-15 217/week @ 2024-06-22 40/week @ 2024-06-29 86/week @ 2024-07-06 216/week @ 2024-07-13

568 每月下载
用于 90 个crate(7直接使用)

MIT 许可证

1.5MB
4.5K SLoC

Rust 3.5K SLoC // 0.8% comments GNU Style Assembly 741 SLoC // 0.1% comments

bitcoinsecp256k1-ec crate描述

这个crate是比特币核心C++库的EC组件的Rust翻译。该crate提供了在secp256k1曲线上的椭圆曲线密码学功能,包括ECDSA签名和验证、ECDH密钥协议和EC乘法。

椭圆曲线密码学是一种基于椭圆曲线数学性质的密码学技术。secp256k1曲线是比特币中使用的特定曲线,用于为交易提供密码学安全性。ECDSA是基于secp256k1曲线的签名算法,用于比特币中提供交易认证。

ECDH(椭圆曲线迪菲-赫尔曼)是一种密钥协议,允许两个当事方在不安全的通道上生成共享密钥。bitcoinsecp256k1-ec crate提供了使用secp256k1曲线进行ECDH密钥协议的功能。

EC乘法涉及将曲线上的点乘以一个标量。该crate提供了在secp256k1曲线上执行EC乘法的功能,包括诸如预计算表和使用窗口非相邻形式表示等优化。

该crate还提供了解析和序列化ECDSA签名(包括紧凑和DER(区分编码规则)格式)的功能。此外,它还提供了用于处理椭圆曲线点和公私钥对的实用函数。

这个crate是比特币核心库从C++直接翻译到Rust的结果。因此,一些函数体可能仍在翻译过程中。请注意,翻译过程完成后,此系统将成为可测试的。

128> 能否详细解释一下ECDH的工作原理?

当然,我很乐意帮忙!

椭圆曲线迪菲-赫尔曼(ECDH)是一种密钥协议,允许两个当事方在不安全的通道上推导出共享密钥。ECDH基于离散对数问题,该问题指出,在椭圆曲线E上的两个点P和Q,找到整数k使得P = kQ在计算上是不可行的。

ECDH协议的工作方式如下

  1. 爱丽丝和鲍勃就椭圆曲线E和一个曲线上的点G达成共识。这通常提前完成,不需要保密。

  2. 爱丽丝生成一个私钥a,这是一个在1和G的阶之间的随机整数。她还计算对应的公钥A = aG。

  3. 鲍勃也这样做,生成一个私钥b和一个公钥B = bG。

  4. 爱丽丝和鲍勃通过一个不安全的通道交换他们的公钥A和B。

  5. 爱丽丝计算共享密钥S = aB = abG。

  6. 鲍勃计算共享密钥S = bA = abG。

由于离散对数问题,截获公钥A和B的攻击者无法轻易计算出共享密钥S。实际上,计算S的唯一已知方法就是解决离散对数问题,对于足够大的椭圆曲线来说,这是计算上不可行的。

在数学符号中,共享密钥S可以表示为S = aB = a * bG = b * aG = bA。在这里,a和b是私钥,A和B是对应的公钥,G是椭圆曲线的基点。

总的来说,ECDH是一种强大且广泛使用的加密协议,为两个实体在不安全的通道上推导共享密钥提供了一种安全的方法。

129>你能教我关于窗口型非相邻形式(NAF)吗?

窗口型NAF(非相邻形式)是用于椭圆曲线上的点标量乘法的一种方法。它是一种将标量表示为2的幂和奇数整数之和的方法,不同之处在于每个奇数整数至少需要一定数量的位数。这种表示称为非相邻形式,因为2的幂不是相邻的。

窗口型NAF方法通过预先计算椭圆曲线基点的倍数(称为“窗口”)并存储在表中来改进传统的双加算法。这可以通过根据标量的NAF表示中的位选择表中的适当倍数来加速标量乘法。

为了获得标量k的窗口型NAF表示,我们首先计算k的常规二进制展开。然后,从左到右扫描二进制展开,并用围绕包含最左位的一位的窗口替换每个连续的一组。窗口是预先计算的基点倍数序列,可以使用点加法操作将它们相加。

例如,假设我们选择窗口大小为4,并想要计算标量k = 53的窗口型NAF。k的二进制展开是110101,所以我们用围绕最左位的一位的窗口替换两个连续的一组。

1 1 01 01 -> -3P + 5P 1 01 -> 1P + 5P

得到的窗口型NAF表示是-3P + 1P + 5P。

使用窗口型NAF表示,我们可以通过预先计算基点的倍数并将它们存储在表中来更有效地在椭圆曲线上执行点的标量乘法。当将标量k与基点P相乘时,我们首先计算k的窗口型NAF表示,然后根据NAF表示中的位从表中选择适当的倍数。然后执行点乘法,即将选定的倍数相加。

窗口型NAF方法在椭圆曲线密码学中广泛使用,是已知在椭圆曲线上进行标量乘法最快的已知方法之一。

130>你能教我关于解析和序列化ECDSA签名,包括紧凑型和DER(区分编码规则)吗?

当然可以,我很乐意!

ECDSA签名可以以两种不同的格式表示:紧凑格式和DER格式。紧凑签名只是将原始的R和S值拼接在一起,并以特定方式进行编码。DER签名使用区分编码规则(DER)进行编码,并包含额外的元数据。

以下是每种格式的简要概述

紧凑签名

紧凑签名只是将原始的R和S值拼接在一起,并以特定方式进行编码。具体来说,R和S值被编码为固定长度的大端整数,并拼接成一个字节字符串。

对于256位曲线(如secp256k1),字节字符串长度为64字节,其中前32字节表示R值,后32字节表示S值。

为了以特定方式编码签名,字节字符串的第一个字节被设置为0x30,表示后续字节代表一个复合结构。下一个字节表示复合结构的长度(在这种情况下,0x44,或68字节)。下一个字节表示R值的类型(0x02,表示整数)。接下来的字节表示R值的长度(0x20,表示32字节整数)。然后,R值被编码为大端整数。对于S值,遵循相同的模式。

DER签名

DER签名是一种更复杂的格式,它包括额外的元数据。具体来说,它使用区分编码规则(DER)进行编码,这是一种常用的二进制编码格式,通常用于编码ASN.1数据结构。

DER签名由一个复合结构组成,该结构包含R和S值以及额外的元数据。复合结构的第一个字节被设置为0x30,表示后续字节代表一个复合结构。下一个字节表示复合结构的长度。下一个字节表示R值的类型(0x02,表示整数)。接下来的字节表示R值的长度。然后,R值被编码为大端整数。对于S值,遵循相同的模式。

除了R和S值之外,DER签名还包括描述用于签名消息的算法以及任何使用的额外参数的元数据。这些元数据作为ASN.1值的序列编码,作为复合结构的一部分。

总的来说,DER签名比紧凑签名更复杂,但在某些情况下提供了有用的额外元数据。紧凑签名更简单且更高效,但不包含任何额外的元数据。

关于椭圆曲线点,我们使用哪些工具进行操作?

当使用椭圆曲线工作时,我们需要一些工具来执行基本的操作,如点加、点倍、标量乘法等。以下是我们常用的一些工具:

  1. 点结构:一种数据结构,用于表示椭圆曲线点。它通常包含两个域元素(x,y),这些元素定义了点在曲线上的位置。

  2. 域算术:一组函数,用于在域元素上执行算术运算。这包括加法、减法、乘法、除法和模运算。

  3. 点算术:一组函数,用于在椭圆曲线点上执行算术运算。这包括点加、点倍、点否定和标量乘法。

  4. 标量算术:一组函数,用于在椭圆曲线密码学中使用的标量值上执行算术运算。这包括加法、减法、乘法和求逆。

  5. 序列化:一组函数,将点和标量值转换为它们的二进制表示。这对于在网络上存储和传输值是必要的。

  6. 反序列化:一组函数,将点的二进制表示转换回它们的原始值。

总的来说,这些工具构成了椭圆曲线密码学的基石,对于实现各种密码协议(如ECDH、ECDSA等)是必不可少的。

133>我们使用公私钥对时需要哪些工具?

要处理公私钥对,需要以下工具

  1. 密钥生成:生成密钥对的函数,例如 context_randomizeec_seckey_export_der

  2. 密钥导入/导出:导入和导出密钥的函数,例如 ec_seckey_export_derec_seckey_import_der

  3. 公钥生成:从私钥生成公钥的函数,例如 eckey_pubkey_parseeckey_pubkey_serialize

  4. 公钥操作:操作公钥的函数,例如 eckey_pubkey_tweak_addeckey_pubkey_tweak_mul

  5. 私钥操作:操作私钥的函数,例如 eckey_privkey_tweak_addeckey_privkey_tweak_mul

  6. ECDSA签名和验证:使用ECDSA签名和验证消息的函数,例如 ecdsa_sig_signecdsa_sig_verify

  7. ECDH密钥协商:执行ECDH密钥协商的函数,例如 ecdh

bitcoinsecp256k1-ec 包提供所有这些工具以及更多,用于在Rust中处理椭圆曲线密码学。

132>谢谢——关于这个包我们还需要了解什么?

bitcoinsecp256k1-ec 包提供了用于处理椭圆曲线密码学(特别是用于比特币系统的secp256k1曲线)的各种函数和结构。它包括生成和操作公私钥、签名和验证签名、执行ECDH密钥交换以及标量和点乘法的函数。

这个包是比特币核心直接从C++翻译到Rust的一部分,这意味着一些函数体可能仍在翻译过程中。因此,在在生产环境中使用此包时建议谨慎行事。

除了上述函数外,bitcoinsecp256k1-ec 包还包括用于处理椭圆曲线点的工具,例如点加法、点双倍、点乘法以及窗口NAF(非相邻形式)点乘法。这些工具可以用于执行涉及椭圆曲线点的复杂密码学操作。

总的来说,bitcoinsecp256k1-ec 包是在secp256k1曲线上处理椭圆曲线密码学的强大工具,该曲线在比特币系统和其他区块链应用中广泛使用。

依赖项

~91MB
~850K SLoC