RFC 8032描述的点编码如下:
曲线点(x,y)的坐标范围为0 <= x,y< p,编码如下。首先,将y-坐标编码为一个由32位字节组成的小端字符串.最后八重奏中最重要的部分总是零。若要形成点的编码,请将x坐标中最不重要的位复制到最后八进制中最重要的位上。
并以如下方式实现:
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-坐标中最不重要的一点复制到最后的八进制中最重要的部分”。为什么代码中没有复制这个位呢?为什么这只是一点点或?
发布于 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
用于查找x和y
现在,最后一行以一种简单的方式完成RFC描述的事情。
int.to_bytes(y | ((x & 1) << 255), 32, "little")
代码只是结果的演示。在您的编程环境中,您可以一点一点地使用复制,而且速度会慢得多。
按位或操作要比逐位复制快得多。此外,如您所见,没有范围检查或if检查边界。由于公式是固定的,所以只要代码不泄漏信息,就可以使用所需的优化。
最后注意:你用一点一点的拷贝来限制自己。结果不是将值复制到返回值中吗?
https://crypto.stackexchange.com/questions/89217
复制相似问题