NaCl和libsodium库使用Curve25519进行身份验证的加密(实际上是共享用于加密的密钥),并使用Ed25519进行签名。对这些操作使用不同的原语的目的是什么?为什么不为密钥共享和签名使用相同的原语?

是否有一些安全性或性能方面的考虑?但是,密钥共享和签名都依赖于曲线点乘以标量的乘积,因此我想您在这里无法通过使用不同的曲线来获得任何收益。如果其中一条曲线更快,则在两种情况下都应该更快。

#1 楼

尽管椭圆曲线Diffie Hellman,椭圆曲线签名生成和椭圆曲线签名验证确实依赖标量乘法,但出于安全和效率方面的考虑,通常将它们实现为不同类型的标量乘法。

实际上,这些方案在实践中使用了三种类型的标量乘法:



固定基数:当在设计时已知标量乘法的输入点时

变量基:当事先不知道标量乘法的输入点时

双重基:当协议实际上需要计算两个标量乘法然后添加两种结果。 (例如$ kP + rB $)

ECDH中通常需要变量基,因为您从另一个对等点收到标量乘法的输入点。

固定-Base用于密钥生成和签名生成。这里的固定基数始终是“生成器点”,它是生成与曲线方程式一起提供的素数次组的点。

双基数用于签名验证( ECDSA和EdDSA和Schnorr)都需要计算形式$ kP + rB $。请注意,与ECDH或签名生成不同,签名验证不使用任何秘密值,因此不需要恒定时间执行。

X25519提供了非常简单,恒定的时间和快速的变量基标量乘法算法。这对ECDH非常有用,这就是为什么它专门用于ECDH的原因。
Ed25519提供了非常快速的固定基数和双基数标量乘法,这要归功于快速而完整的扭曲Edwards加法法。
实际上,在大多数平台上,Ed25519的固定基算法比X25519的可变基算法更快。

使用X25519进行签名验证不是一个好主意,因为您需要执行两次(计算$ kP $和$ rB $),然后添加一个新函数来对两个结果点进行完全相加。此外,您在不需要时使用恒定时间计算。相反,您可以使用交错的NAF方法和扭曲的Edwards加法则来实现更快的实现。

注意:出于这个答案的目的,我并没有区分不同的椭圆曲线签名算法(例如ECDSA)和EdDSA。

评论


$ \ begingroup $
在某些情况下,甚至将X25519和Montgomery阶梯一起用于签名可能是值得的:qDSA似乎在微控制器上优于EdDSA,其内存和代码大小比诸如FourQ的其他Edwards替代品要少得多。
$ \ endgroup $
–吱吱作响的s骨
19 Mar 19 '19 at 14:44

#2 楼

旧术语令人困惑,因此它们重新命名了。 (EdDSA)Curve25519上的

crypto_scalarmult() / crypto_box()以及crypto_sign()实际上都使用了libsodium的ref10 curve25519代码。

评论


$ \ begingroup $
出于挑剔,Ed25519是一条扭曲的Edwards曲线上的EdDSA,它与等价于代数组,但同构但不同构,因此通常不被视为“同”。
$ \ endgroup $
–吱吱作响的s骨
17年9月16日在18:40

$ \ begingroup $
您在技术上是正确的,最好的一种正确。
$ \ endgroup $
–斯科特·阿西塞夫斯基(Scott Arciszewski)
17年9月17日在19:02

$ \ begingroup $
呜!我有奖品吗?另外,您确定libsodium的crypto_sign_ed25519使用crypto_scalarmult_curve25519吗?这将很奇怪,因为crypto_scalarmult_curve25519仅限于$ x $,而crypto_sign_ed25519即使只有一个位也需要$ y $坐标。一个常量crypto_scalarmult_curve25519_BYTES似乎出现在crypto_sign / ed25519 / keypair.c中的一个例程中,该例程通过散列种子并夹紧标量的位,将Ed25519机密转换为X25519机密,但这仅是全部。
$ \ endgroup $
–吱吱作响的s骨
17年9月17日在21:10

#3 楼

Curve25519利用仅特殊的x坐标形式来实现更快的乘法。 Ed25519将Edwards曲线用于类似的加速,但包括一个符号位。尽管可以用不同的方式完成,但是这样做可以简化仅需要加密或签名之一的实现。

评论


$ \ begingroup $
我认为Ed25519使用扭曲的Edwards曲线,而不是(普通的)Edwards曲线。
$ \ endgroup $
–étale-cohomology
17年11月9日在22:47