首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >验证Ed25519公钥

验证Ed25519公钥
EN

Security用户
提问于 2020-06-11 09:30:43
回答 1查看 2.8K关注 0票数 7

是否可以测试Ed25519公钥是否有效,而不访问私钥、签名消息或除公钥以外的任何东西?

“有效”,如“不只是32个随机字节”。

我假设并不是每一个随机的比特组合都可以作为公钥生成。

EN

回答 1

Security用户

发布于 2020-06-11 10:37:23

是。为了使公钥有效(不只是32个随机字节),点必须在曲线上。你可以通过将x和y值插入曲线的方程中,并求解方程“超越场”来测试点是否在曲线上,以查看方程是否正确。

例如,secp256k1曲线的方程是:

代码语言:javascript
复制
 y^2 = x^3 + 7

其场特征(p)是:

代码语言:javascript
复制
p=0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f

因此,要检查一个点是否在曲线上,您可以将点的x和y值插入下面的方程,并测试它是否检查:

代码语言:javascript
复制
(y^2 - x^3 - 7) % p == 0

以下是secp256k1曲线上的一点:

代码语言:javascript
复制
(0x5633454c810b6e3c881e35f904a6215f1825e46429a54061d1b7448be1b4285e, 0xd1016a4e4b8c6d3a2220e76c8cd66d0ad8e42c1ea84109fef12fa601b5dd09b8)

但是,以下一点并不是:

代码语言:javascript
复制
(0x2d09f894eff47eba35ae4eda6ecfe71fb8263b84c092249e820ba5e6e73c0da3, 0x19ece9e391ce286cbb1907c38359dd4c086e5540fc82593731a2f893ef1bedef)

下面是一个简短的Python脚本,可以用来测试点是否在曲线上。

代码语言:javascript
复制
def isoncurve(x, y):
    # For secp256k1
    p=0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f
    return (y * y - x * x * x - 7) % p == 0

#returns True
x=0x5633454c810b6e3c881e35f904a6215f1825e46429a54061d1b7448be1b4285e
y=0xd1016a4e4b8c6d3a2220e76c8cd66d0ad8e42c1ea84109fef12fa601b5dd09b8
print (hex(x) + ',' + hex(y) + ' is on secp256k1 curve: ' + str(isoncurve(x, y)))

# Returns False
x=0x2d09f894eff47eba35ae4eda6ecfe71fb8263b84c092249e820ba5e6e73c0da3
y=0x19ece9e391ce286cbb1907c38359dd4c086e5540fc82593731a2f893ef1bedef
print (hex(x) + ',' + hex(y) + ' is on secp256k1 curve: ' + str(isoncurve(x, y)))
票数 8
EN
页面原文内容由Security提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://security.stackexchange.com/questions/233099

复制
相关文章

相似问题

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