我遇到了一个问题,我使用像pynacl (https://pynacl.readthedocs.io/en/stable/signing/) ed25519实现这样的库生成签名,然后当我使用xedDSA的验证函数(https://github.com/signalapp/curve25519-java/blob/master/android/jni/ed25519/additions/xeddsa.c#L45)验证它时,它有时会传递,有时会失败。
这似乎与生成签名的priv/pub密钥对有关。一旦键盘生成xedDSA函数可以验证的签名,所有后续签名也将从相同的键区正确验证。我正在将由pynacl提供的ed25519公钥转换为curve25519 pub密钥(verify_key.to_curve25519_public_key()),然后将其传递给xedDSA函数。
在这里的介绍:https://signal.org/docs/specifications/xeddsa/#curve25519
说明ed25519签名将被xedDSA验证函数正确地验证。但这里的情况并非如此。
有人能告诉我为什么会发生这种事吗?我很有信心,它与键生成和随后的ed公键转换为曲线公匙有关。但我对密码的了解还不足以确定这个问题。
发布于 2018-10-05 08:14:48
来自您的链接:
XEd25519签名是有效的Ed25519签名,反之亦然,只要公钥与出生映射进行转换。
不幸的是,反之亦然。
XEd25519的工作方式是要求私钥是正数,因为它会产生一个正面的爱德华兹公钥。如果私钥生成带有负x的公钥,则通过否定私钥来获得此结果。(在LSB的意义上是负的和正的,就像在ed25519中那样)
在验证中假定这是有效的,但如果签名是用ed25519生成的,则不会。
更具体地说,在ed25519中,您可以同时拥有正公钥和负公钥A。然后,您的签名被计算为:R = rB, s = r + ha,注意,在ed25519中,您有那个A = aB。验证是通过验证R = sB - hA完成的。
在ed25519中,这是因为R = rB = (r + ha)B - h(aB)。
但是,当使用XEd25519时,事情会发生变化,因为公钥被隐式地假定为正(curve25519缺少符号信息,因此应该做一些假设),所以您最终会在验证方程:rB \neq (r + ha)B - h*(-A)中出现符号位翻转。
因此,您可以通过这种方式验证由带有正公钥的ed25519密钥对生成的签名。
修正:我认为您可能可以测试R = (r + ha)B \pm hA,如果签名是有效的,那么在两种情况中其中一种情况下,这是可以接受的,但是我想,当您的实现使用了用于签名验证的双基标量乘法时,这将是一个问题。更好的方法是将XEd25519替换为qDSA,这是在Montgomery曲线上进行签名的一种更自然的方法。
https://crypto.stackexchange.com/questions/62879
复制相似问题