整理自 Crypto In Action
ElGamal 签名机制是在椭圆曲线密码学诞生之前提出的, 签名值较大。Schnorr 提出了可以看做是 ElGamal 签名机制变种的 Schonrr 签名机制, 大大缩短签名值的长度。而数字签名算法 DSA 是吸收了 Schnorr 签名设计思想的另一种 ElGamal 签名机制的变种签名机制。基于椭圆曲线的 DSA 方案即为熟知的 ECDSA。
曲线 secp256k1 的名字来自于密码学标准文档 SEC2 , 其中
进而减少交易体积(不需要存公钥)。ETH 中这么干了,BTC 没这么干。
签名算法里面有个 随机数k,每次签出来的名可能不一样
因为那时候 Curve25519 还没出世。
由上面的 ECDSA 签名机制应用中的安全隐患 说明不够安全, 虽然 自同态映射可以加速 ECDSA 签名验证过程,但也说明不是天然就是快。
EdDSA (Edwards-curve Digital Signature Algorithm) 签名机制是这个研究方向上的成果.
EdDSA 签名机制是定义在 Edwards25519 曲线上的变种 Schnorr 签名, 其设计初衷是在不牺牲安全性的前提下提升签名/验签速度, 并同时解决前述的 ECDSA 在应用方面存在的一些问题。
(Edwards25519 是 twisted edwards curve,虽然名字中不带 twisted。)
广泛使用的 EdDSA 签名机制是基于哈希函数 SHA-512 和椭圆曲线 Edwards25519 的 Ed25519 签名机制。
Curve25519 是 Bernstein7 在 2005 年为了提升 ECDH 密钥交换协议 (Elliptic Curve Diffie-Hellman Key Agreement) 效率而提出的蒙哥马利曲线
在 2005 年的论文中 Curve25519 实际上用来指代 ECDH 密钥交换协议, 然而后来多使用 Curve25519 指代底层的椭圆曲线, 用 X25519 指代基于 Curve25519 的 ECDH 密钥协议
X25519 直接构建在 Curve25519 之上, 而 Ed25519 构建在 Edwards25519 之上, 并且 Curve25519 和 Edwards25519 是双向有理等价的。
这是因为 ECDH 协议和 EdDSA 协议计算过程中重度依赖的点群运算不同, 这是为更好的适配的上层协议而刻意选择的中层的椭圆曲线点的表示的结果。
Curve25519 是基于素数域 $\mathbb{F}_q, q = 2^{255} - 19$ 上的蒙哥马利曲线.
Curve25519 曲线双向有理等价于 (Bi-rational Equivalent)、同构于 (Isomorphic) 扭曲爱德华曲线 (Twisted Edwards Curves) Edwards25519, 提供大约 128 比特的安全强度 (与 secp256k1 和 secp256r1 安全强度一致)。
secp256k1/secp256r1 的 Short Weierstrass 形式的椭圆曲线表示: $y^2 = x^3 + ax + b$
蒙哥马利曲线: $Y^2 = X^3 + AX^2 + X$
爱德华曲线: $x^2 + y^2 = 1 + d x^2 y^2$。
2008 年 Bernstein 等人指出有限域上只有一小部分椭圆曲线能够表示为爱德华曲线, 并进一步提出了更为广义的扭曲爱德华曲线 (Twisted Edwards Curves)。
扭曲爱德华曲线: $-X^2 + Y^2 = 1 - d X^2 Y^2$
Short Weierstrass, 蒙哥马利曲线以及爱德华曲线都可以通过符号代换与 广义 Weierstrass 曲线 $y^2 + a_1 xy + a_3 y = x^3 + a_2 x^2 + a_4 x + a_6$ 相互转换。
X25519 和 Ed25519 的做依赖的点的运算都可以转换成为 Weierstrass 曲线上的点运算, 然而使用特定的曲线形式, 对于高效安全的 X25519 或者 Ed25519 大有裨益. 以 Edwards25519 为例, 其上的点的加法运算是完备的 (Complete),并且单位元为点 (0, 1), 简洁优雅。且构造椭圆曲线的加法点群时无需引入一个假想的无穷远点来满足群的条件。相比之下,Short Weierstrass 形式下椭圆曲线点加运算则需进行各种边界条件判断。
Edwards25519 是定义在有限域 $\mathbb{F}_q, p = 2^{255} - 19$ 上选用参数 $a = -1, d = \frac{121665}{121666}$ 的扭曲爱德华曲线: $-x^2 + y^2 \equiv 1 - (121665/121666)x^2 y^2 \mod p$
X25519 是在 Curve25519 上的 仅基于 x 坐标 的 ECDH 密钥协议。
仅利用椭圆曲线点的 x 坐标构建 ECDH 的想法最初来自于 Victor Miller 在 1985 年发表的奠基性文章 "Use of elliptic curves in cryptography"
ECDH 的实际交互过程部署中需要着重考虑对接收到的 临时公钥点的检查, 否则 可能导致私钥被盗。(见 [Hankerson, Darrel, Alfred J. Menezes, and Scott Vanstone. ”Guide to elliptic curve cryptography.” Computing Reviews 46, no. 1 (2005): 13] 中 4.3 小节):
X25519 (相比其他的 ECDH) 引入了扩域上的椭圆曲线点群使所有的 $x \in \mathbb{F}_p$ 都是合法的公钥,省去 繁重的公钥合法性验证。只要在两个点群上的离散对数问题都是困难的,X25519密钥交换协议就是安全的。
X25519 对 常量时间 实现非常友好:
与 secp256k1/secp256r1 等曲线的私钥可以在某个区间内连续取值 (整数值) 不同, 曲线 Curve25519 上的私钥并 不是某个区间内的连续取值, 这是为了规避余因子不为 1 可能引发的安全隐患, 但同时也部分影响了曲线的应用方式, 尤其是当希望在 Ed25519 签名算法上实现 BIP-32 时
另外余因子为 8 导致 CryptoNote 协议中构建 RingCT 交易时引入了安全漏洞 (secp256r1/secp256k1 曲线的余因子为 1 故无此隐患) 导致双花。Edwards25519 本用于 EdDSA,被 Monero 挪作他用 (XEdDSA) 。
是否存在方法能够既享用 Curve25519/Edwards25519 的优势, 又能够解放上层密码协议的设计?
没有联系,虽然都是椭圆曲线上的。Ed25519 属于 EdDSA,但是 ECDSA 与 EdDSA 也没有关系。ECDSA 是一个又慢又不够安全的过时设计,EdDSA 是一个 更快更安全的现代设计。