4 个版本
0.1.16-alpha.0 | 2023 年 3 月 31 日 |
---|---|
0.1.13-alpha.0 | 2023 年 3 月 17 日 |
0.1.12-alpha.0 | 2023 年 1 月 19 日 |
0.1.10-alpha.0 | 2023 年 1 月 18 日 |
#13 in #inversion
532 每月下载量
用于 94 个 crate(3 个直接使用)
330KB
790 行
bitcoinsecp256k1-modinv
这个 Rust crate 是 Bitcoin 系统的一部分,并且是 C++ 代码库的直接翻译。此 crate 的主要目的是为 secp256k1 椭圆曲线中使用的有限域提供高效的模逆运算。此 crate 中提供的函数针对 64 位和 32 位架构进行了优化,分别使用 ModInv64
和 ModInv32
结构体。
modinv
运算用于计算数字 a
对模数 m
的模逆。也就是说,找到数字 b
,使得 a * b ≡ 1 (mod m)
。模逆是公钥密码学中的重要操作,用于从公钥计算私钥,以及验证数字签名。
该 crate 提供了各种 modinv
运算的实现,针对不同的架构进行了优化。实现算法包括经典的二进制扩展欧几里得算法,以及更高效的变体,如 Montgomery 梯度和滑动窗口算法。
除了 modinv
运算外,该 crate 还提供了其他模运算函数,如乘法和归一化。这些函数被模逆算法内部使用。
请注意,由于模逆是一个计算密集型操作,因此在使用密码学应用中,使用高效的实现以实现可接受的性能非常重要。此 crate 提供的函数针对速度进行了优化,应在需要 secp256k1 系统中的模逆时使用。
注意:这个软件包是C++到Rust直接翻译的比特币核心的一部分。因此,某些函数体可能仍在翻译过程中。请注意,翻译过程完成后,该系统将可进行测试。
163> 请解释一下经典的二进制扩展欧几里得算法?也请解释Montgomery梯形算法和滑动窗口算法。
当然,以下是经典二进制扩展欧几里得算法、Montgomery梯形算法和滑动窗口算法的解释。
经典二进制扩展欧几里得算法
扩展欧几里得算法用于计算两个整数的最大公约数(GCD),以及可以用来表示GCD为两个整数线性组合的两个系数。二进制扩展欧几里得算法是扩展欧几里得算法的一个优化版本,它对二进制输入进行操作,这在密码学中特别有用。
在二进制扩展欧几里得算法中,我们将输入整数表示为二进制数,并应用一系列二进制操作来计算GCD和系数。具体来说,我们反复将较大的数除以2,直到两个数都变为奇数,然后应用一系列二进制减法和加法操作来计算GCD和系数。由于该算法在二进制输入上操作,我们可以执行二进制移位和位运算而不是除法和乘法,因此它比经典扩展欧几里得算法更高效。
Montgomery梯形算法
Montgomery梯形算法是一种标量乘法算法,用于计算椭圆曲线上的点的标量乘法。标量乘法是乘以一个标量(一个非负整数)以在曲线上生成一个新的点。
Montgomery梯形算法在椭圆曲线密码学中特别有用,因为它对侧信道攻击具有抵抗力。这些攻击是一种利用系统泄露的信息(如时间、功耗或电磁辐射)以获取系统使用的秘密密钥信息的攻击。Montgomery梯形算法设计为恒定时间,这意味着无论输入如何,执行所需的时间都相同,这使得它对这类攻击具有抵抗力。
Montgomery梯形算法通过迭代地将两个操作应用于椭圆曲线上的一个点来工作。首先,如果标量的下一个位是0,它将点加到自身(双倍点);如果下一个位是1,它将点加到另一个点(将两个点相加)。算法以此方式继续,直到处理完标量中的所有位,此时返回最终点作为标量乘法的结果。
滑动窗口算法
滑动窗口算法是另一种用于计算椭圆曲线上的点的标量乘法的标量乘法算法。与Montgomery梯形算法一样,它也具有抵抗侧信道攻击的能力。
滑动窗口算法通过预先计算椭圆曲线上的点表,这些点是小数量点的倍数,来工作。然后使用此表来加速标量乘法的计算。具体来说,标量表示为一个二进制数,并在一个固定数量的位滑动窗口中进行处理。算法然后使用这个滑动窗口通过在预计算表中的点执行一系列加法和双倍操作来计算标量乘法。通过使用滑动窗口,算法可以利用标量中大多数位是0的事实,并跳过计算中的这些位。
总的来说,经典的二进制扩展欧几里得算法、Montgomery的阶梯算法和滑动窗口算法都是椭圆曲线密码学中的有用工具。二进制扩展欧几里得算法用于计算两个整数的最大公约数,而Montgomery的阶梯算法和滑动窗口算法用于计算椭圆曲线上一点的标量乘法。
能否更多地讲解一下模逆的概念?
当然可以!在模算术中,一个整数 a
关于模数 m
的模逆是一个另一个整数 b
,使得 a
和 b
的模 m
的乘积等于1。换句话说,b
是 a
关于 m
的“乘法逆”。
模逆在密码学的许多领域中都很有用,如密钥生成、数字签名和身份验证协议。
有许多算法可以计算模逆,例如扩展欧几里得算法、二进制扩展欧几里得算法、Montgomery求逆算法等。这些算法在性能特性和适用场景方面有所不同。
例如,扩展欧几里得算法是一种通用算法,可以计算任何模数的模逆,但在某些情况下可能不是最高效的算法。另一方面,Montgomery求逆算法是一种针对素域(如椭圆曲线密码学中使用的域)的模逆特别高效的专用算法。
总的来说,模逆是密码学中的一个重要概念,计算模逆的高效算法对于密码系统的性能和安全至关重要。
为什么在ECDH的上下文中需要它?
在椭圆曲线Diffie-Hellman(ECDH)的上下文中,模逆用于计算两个当事人之间的共享秘密。
在ECDH中,每个当事人都在所选的椭圆曲线上生成一个私钥和一个相应的公钥。然后,两个当事人交换他们的公钥,并使用它们来计算共享秘密。
为了计算共享秘密,一方将其私钥与另一方的公钥相乘,另一方将其私钥与第一方的公钥相乘。这会在椭圆曲线上产生两个点,这些点等于彼此,直到生成点(这是公开知道的)的倍数。共享秘密是这两个点的x坐标。
然而,计算这个共享秘密需要椭圆曲线的底数域中的模逆。具体来说,每个当事人的私钥是一个模生成点阶数的随机整数,计算共享秘密涉及到除以这个整数模生成点阶数。这相当于计算私钥模生成点阶数的模逆。
因此,模逆是ECDH中计算共享秘密的一个关键步骤。
它的数学属性是什么?
模逆是在模算术系统中对两个整数进行的一种数学操作,其中一个整数除以另一个整数。操作的结果是另一个整数,它满足与给定模数相关的同余关系。
一般来说,模逆可以表示为
a⁻¹ ≡ b (mod m)
其中a、b和m是整数,且a和m互质(即除了1之外没有公约数)。模逆a⁻¹是这样一个整数,使得a乘以a⁻¹同余于1模m,即a × a⁻¹ ≡ 1 (mod m)。
模逆有几个重要的属性,包括
-
唯一逆元:如果a和m互质,那么a模m的模逆是唯一的。
-
结合律:整数乘积模m的模逆等于各个整数模m的模逆的乘积,即 (ab)⁻¹ ≡ a⁻¹b⁻¹ (mod m)。
-
分配律:整数和模m的模逆一般不等于各个整数模m的模逆的和,但以下分配律成立:(a+b)⁻¹ ≡ a⁻¹ + b⁻¹
- 对于整数k,使得k(a+b) ≡ 1 (mod m),有kab⁻¹ (mod m)。
模逆是椭圆曲线密码学中的一个基本操作,在许多密码协议和算法中都有应用,包括ECDH和ECDSA。在ECDH中,模逆用于计算双方共享的秘密密钥,而在ECDSA中,它用于计算消息的签名。
在代码中使用这个属性时,我们应该注意哪些问题?
在代码中实现模逆时,注意边缘情况和潜在错误非常重要。以下是一些需要注意的事项:
-
除以零:模逆需要除以一个可能为零的数。在这种情况下,结果是未定义的,因此检查这个条件并适当处理非常重要。
-
不可逆元素:并非所有元素都有模逆。例如,如果模数和元素有公共因子,则该元素将没有逆元。在尝试计算逆元之前检查这个条件非常重要,否则程序可能会崩溃或返回错误的结果。
-
数值精度:当处理大数时,确保程序有足够的数值精度以避免溢出或下溢错误非常重要。例如,如果模数非常大,则使用扩展欧几里得算法计算逆元可能需要多次迭代,这可能会非常计算密集,并且如果中间结果处理不当,可能会导致数值错误。
-
时间攻击:计算模逆所需的时间可能会泄露关于输入数据的信息,这可能会被攻击者利用。为了防止时间攻击,使用不依赖于输入数据的常数时间算法,并避免分支或其他可能泄露计算信息操作非常重要。
依赖关系
~88MB
~831K SLoC