注:作者离成为一名密码学家还差得远,请读者对准确性持怀疑态度。 本文只讨论下层曲线(underlying curve),公钥派生和签名算法将分别处理。
Monero中使用Edwards25519椭圆曲线作为密钥对生成的基础。曲线来自Ed25519签名方案,虽然在门罗币中保持曲线不变,但它并不完全遵循Ed25519的其余部分。 Edwards25519曲线与 Curve25519是双有理等效的。
定义
这是标准的Edwards25519曲线定义,除了命名约定以外没有门罗币特有的内容。这一惯例来自于CryptoNote白皮书,在门罗币文献中被广泛使用。
曲线等式定义
−x^2 + y^2 = 1 − (121665/121666) * x^2 * y^2
注释:
- 曲线是二维的 (毫无疑问,正如高中所学的曲线)
- 由于公式的y^2部分, 曲线是在y轴下方的镜像 (非多项式)
基点: G
基点是曲线上的一个特定点,它被用作进一步计算的基础。这是曲线作者的任意选择,只是为了标准化方案。 注意,它足以指定y值和x值的符号。这是因为具体的x可以从曲线方程中计算出来。
G = (x, 4/5) # 从正数x中获得该点
5866666666666666666666666666666666666666666666666666666666666666# 基点的16进制表示为
基点的素数阶: l
在布局术语中,假设绘制曲线的“画布”具有有限的“分辨率”,因此点坐标必须在某个点“环绕”。这是通过将l值(小写L)模化来实现的。换句话说,l定义了我们可以使用的最大标量。
l = 2^252 + 27742317777372353535851937790883648493
# => 7237005577332262213973186563042994240857116359379907606001950938285454250989
l是曲线作者所指定的质数。 实际上,这是私钥的强度(strength)。
曲线上点的个数
曲线上的总点数也是质数:
q = 2^255 - 19
实际上,并非所有的点都是“有用的”,因此私钥的强度仅限于上面的l描述。
实现
Monero使用了Daniel J.Bernstein的Ref10实现(显然经过了修改)。
参考
- A (Relatively Easy To Understand) Primer on Elliptic Curve Cryptography
- RFC 8032 defining EdDSA
- Understanding Monero Cryptography - excellent writeup by Luigi
- StackOverflow answer
- Python implementation - not the reference one but easier to understand
- Encoding point to hex
- EdDSA on Wikipedia