如果不是中本聪,你可能永远不会听说secp256k1椭圆曲线密码学(ECC)方法。但是,中本聪用它来获取私钥,然后生成一个公共标识符。
采用比特币的核心是使用ECDSA(椭圆曲线数字签名算法),并且可以通过公共比特币标识符来验证交易。secp256k1标准已发布:https://www.secg.org/sec2-v2.pdf。
这是椭圆曲线的Weierstrass形式,并使用:
y ²= x³ +7 (mod p)
它的基点为 g=(0x79be667ef9dcb … 959f2815b16f81798, 0x483ada77 … 8ffb10d4b8) 和一个质数 ²²⁵⁶−²³²−²⁹−²⁸−²⁷−²⁶−²⁴−1。曲线的阶数为n =0xfffffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141。
总的来说,我们有一个私钥a,然后产生一个公钥aG。对于secp256k1,我们有一个256位的私钥值和一个512位的公钥值(这是椭圆曲线上的一个点)。
为什么是secp而不是NIST?
谁知道为什么中本聪选择了secp256k1曲线而不是NIST定义的secp256k1曲线。许多人质疑NIST和NSA之间的密切关系,以及在曲线中插入后门的可能性。因此,也许中本聪选择secp256k1就是出于这个原因。
secp256k1的要点
椭圆曲线上的点并不总是给出一个有效的x坐标。同样,每个有效的x坐标值都有两个点:
-
在x范围内公共曲线的椭圆曲线点。例子:https://asecuritysite.com/ecc/ecc_points4。本例使用曲线25519、secp256k1、P256和P512来显示给定x坐标范围内的点的范围。
-
有限域内普通曲线的前20个椭圆曲线点。例子:https://asecuritysite.com/ecc/ecc_points2。在有限域内定位椭圆曲线的前20个点,曲线包括Curve25519 (Tor), secp256k1(Bitcoin)和NIST P-256。
带有 secp256k1 的蒙哥马利阶梯
椭圆曲线密码学之所以快速,是因为它能够将一个点(G)乘以一个标量值(通常是私钥)来得到aG。因为有蒙哥马利阶梯,所以是快速的:
- 蒙哥马利阶梯在固定时间内计算kG。计算secp256k1 的kG。
制图
椭圆曲线在它的模拟中是美丽的,但在离散时指向:
- 绘制 y² = x ³+7(mod p )
点乘法
椭圆曲线密码的核心,是我们执行点乘法:
-
(1G, 2G, nG)的真实ECC曲线。例子:https://asecuritysite.com/ecc/ecc_real。曲线25519、secp256k,等等。
-
使用Python。例子:https://asecuritysite.com/ecc/python_secp256k1Inv。在这个例子中,Alice发送aG,Bob返回abG。然后Alice计算a−1(mod n),然后可以确定a^{−1}abG=bG。secp256k1曲线为Weierstrass曲线形式(y²=x³+ax+b)。
密钥生成
椭圆曲线密码学主要关注数字签名过程,我们生成一个私钥(sk)和一个公钥(pk)。密钥对定义如下:
-
椭圆曲线(OpenSSL密钥生成)。椭圆曲线:https://asecuritysite.com/ecc/keypair2。椭圆曲线是一种公钥方法。该页介绍了ECC密钥的生成,包括secp128r1。
-
椭圆曲线(密钥)。椭圆曲线:https://asecuritysite.com/ecc/ecc。椭圆曲线是一种公钥方法。本页概述了比特币中ECC密钥的生成。
带有 secp256k1 的 ECDH
除数字签名外,椭圆曲线方法也用于密钥交换:
-
带有 secp256k1 的 ECDH。例子:https://asecuritysite.com/ecdh/ecdh2。ECDH用于创建共享密钥。
-
不同曲线的ECDH。例子:https://asecuritysite.com/ecc/ecdh3。ECDH用于使用不同的曲线创建共享密钥,包括secp256k1、p192和p224。
-
secp256k1 ECDH与Python。secp256k1 ECDH:https://asecuritysite.com/ecc/python_secp256k1ecdh。ECDH使用secp256k1与Python。secp256k1曲线为Weierstrass曲线形式(y²=x³+ax+b)。
-
使用Python验证secp256k1 ECDH。例子:https://asecuritysite.com/ecc/python_secp256k1ecdh2。ECDH使用secp256k1和Python,其中我们使用Bob和Alice的长期密钥来创建共享会话密钥。secp256k1曲线为Weierstrass曲线形式(y²=x³+ax+b)。
ECDSA
比特币和以太坊信任的核心部分是使用 ECDSA 签名:
-
椭圆曲线数字签名算法(ECDSA)。ECDSA:https://asecuritysite.com/ecdsa/ecdsa。椭圆曲线数字签名算法(ECDSA)用于对数据进行签名。
-
具有核心操作的椭圆曲线数字签名算法 (ECDSA)。ECDSA:https://asecuritysite.com/ecdsa/ecdsa2)。椭圆曲线数字签名算法(ECDSA)用于对具有核心操作的数据进行签名。
但需要谨慎对待:
-
从随机数 (SECP256k1) 的泄漏中破解 ECDSA。ECDSA与nonce:https://asecuritysite.com/ecc/ecd3。这概述了ECDSA如何通过secp256k1的nonce值泄漏来恢复私钥。
-
用弱随机数破解ECDSA。ECDSA与弱随机数:https://asecuritysite.com/ecc/ecd。这概述了ECDSA如何使用弱随机数值恢复私钥。
-
盲化ECDSA。盲化ECDSA:https://asecuritysite.com/ecc/blinding_ecdsa。使用盲签名,Bob 可以在不知道消息是什么的情况下签名消息。在这种情况下,Alice 将创建一个盲化的 ECDSA 签名,Bob 可以在其中签名,然后 Alice 可以对其进行解密。该方法基于 Oleg Andreev 为比特币中的盲签名而制作的方法。
-
ECDSA:故障攻击。ECDSA故障攻击:https://asecuritysite.com/ecc/ecd7。在ECDSA中的故障攻击中,我们只需要两个签名。一个没有故障(*r*,*s*),另一个有故障(*rf*,*sf*)。
公钥的大小是多少?
由于公钥是一个点,在其最纯粹的形式中,我们有一个512位的公钥,它由256位的x坐标和256位的y坐标组成。但是,其实也可以压缩它,因为我们可以很容易地从x坐标推导出y坐标。最后,只有两个可能的y坐标,所以我们要做的就是记录它是奇数还是偶数,然后用一个标识符和x坐标压缩这个点:
02、03 还是 04?那么什么是压缩和未压缩的公钥?https://asecuritysite.com/ecc/js_ethereum2
结论
在密钥交换中使用ECDH,在数字签名中使用ECDSA,secp256k1 曲线已被证明可以在密钥交换和 RSA 签名中取代 Diffie-Hellman 方法。
Source:https://medium.com/asecuritysite-when-bob-met-alice/the-bluffers-guide-to-secp256k1-when-satoshi-said-goodbye-to-pki-bad327c4f079
关于
ChinaDeFi - ChinaDeFi.com 是一个研究驱动的DeFi创新组织,同时我们也是区块链开发团队。每天从全球超过500个优质信息源的近900篇内容中,寻找思考更具深度、梳理更为系统的内容,以最快的速度同步到中国市场提供决策辅助材料。
本文首发于:https://mp.weixin.qq.com/s/Jb-z7G9yJxwBGS6Y7gfKww