schnorr签名用到了椭圆曲线,使用一个椭圆曲线上的点$R$和一个常量$pk$作为私钥,那么公钥为$P=pk*G$
$G$是椭圆曲线的基点。知道$P$和$G$,是无法推出私钥的。签名时,随机选择一个$k$,计算$R=k*G$。
然后使用哈希计算要签名的消息以及$R$的哈希,然后再计算,发送$(R,s)$作为签名。验证时,计算,看左右两边的点横坐标是否相同。因为都是椭圆曲线上的点,所以需要调用椭圆曲线的加和乘,计算结果也在曲线上,所以也不用考虑取模了。
这里理论上来讲发过去的应该要是512位的,但是这里的实现因为有两个坐标,各256位,还要marshal,变成了65字节,所以不能算作严谨的版本。理论上来说可以只发,验证方可以通过算出来,但是不知道如何实现,只好这样折衷一下多发些字节过去。
1 | package main |