首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >文档和实现之间的EdDSA点编码差异

文档和实现之间的EdDSA点编码差异
EN

Cryptography用户
提问于 2021-04-06 10:39:36
回答 1查看 76关注 0票数 1

RFC 8032描述的点编码如下:

曲线点(x,y)的坐标范围为0 <= x,y< p,编码如下。首先,将y-坐标编码为一个由32位字节组成的小端字符串.最后八重奏中最重要的部分总是零。若要形成点的编码,请将x坐标中最不重要的位复制到最后八进制中最重要的位上。

并以如下方式实现:

代码语言:javascript
复制
def point_compress(P):
    zinv = modp_inv(P[2])
    x = P[0] * zinv % p
    y = P[1] * zinv % p
    return int.to_bytes(y | ((x & 1) << 255), 32, "little")

你能解释一下这个句子中“拷贝”一词的意思吗?“把x-坐标中最不重要的一点复制到最后的八进制中最重要的部分”。为什么代码中没有复制这个位呢?为什么这只是一点点或?

EN

回答 1

Cryptography用户

回答已采纳

发布于 2021-04-06 11:24:10

你能解释一下这个句子中“拷贝”一词的意思吗?“把x-坐标中最不重要的一点复制到最后的八进制中最重要的部分”。为什么代码中没有复制这个位呢?为什么这只是一点点或?

首先要注意这一点;

点表示为扩展 #坐标的元组(X,Y,Z,T),x= X/Z,y= Y/Z,x*y = T/Z

所以zinv就是从那里来的

X= P0 * zinv %p= P1 * zinv %p

用于查找xy

现在,最后一行以一种简单的方式完成RFC描述的事情。

int.to_bytes(y | ((x & 1) << 255), 32, "little")

代码只是结果的演示。在您的编程环境中,您可以一点一点地使用复制,而且速度会慢得多。

按位或操作要比逐位复制快得多。此外,如您所见,没有范围检查或if检查边界。由于公式是固定的,所以只要代码不泄漏信息,就可以使用所需的优化。

最后注意:你用一点一点的拷贝来限制自己。结果不是将值复制到返回值中吗?

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

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

复制
相关文章

相似问题

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