首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用EdDSA验证函数验证xedDSA签名。

使用EdDSA验证函数验证xedDSA签名。
EN

Cryptography用户
提问于 2018-10-05 06:25:51
回答 1查看 1.7K关注 0票数 3

我遇到了一个问题,我使用像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公键转换为曲线公匙有关。但我对密码的了解还不足以确定这个问题。

EN

回答 1

Cryptography用户

回答已采纳

发布于 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曲线上进行签名的一种更自然的方法。

票数 6
EN
页面原文内容由Cryptography提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://crypto.stackexchange.com/questions/62879

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档