跳到主要内容
ecdsa.com

余因子

椭圆曲线上的点数与密码学所用子群的素数阶 n 之比 h = #E / n:NIST P 系列曲线和 secp256k1 为 1,Curve25519 为 8,Curve448 为 4。
其他写法curve cofactorsmall subgroup

h 大于 1 时,曲线中存在小子群,因此对端提供的点可能不在素数阶子群中。协议的处理方法有:乘以余因子(SP 800-56A 中的余因子 Diffie–Hellman);把秘密标量钳位为余因子的倍数(X25519、Ed25519);检查子群成员关系;或者使用具有素数阶的抽象,例如 ristretto255 或 decaf448(RFC 9496)。

实际出现过的缺陷:2017年,CryptoNote 的余因子问题使一个 Monero 输出能够生成多个有效的密钥镜像,在修复之前本可能导致双花。EdDSA 验证器如果在带余因子与不带余因子的检查上不一致(RFC 8032 §5.1.7 两者都允许),就会接受不同的恶意构造签名集合,这在共识系统中很关键。

余因子为 1 的 Weierstrass 曲线没有这些问题,这也是素数阶曲线在多方计算和可验证随机函数等需要简单群语义的协议中依然流行的原因之一。

标准与参考资料

全部术语