未央网|区块链技术中的非对称加密算法——签名和加密( 二 )


kG(x,y)=K(x',y') , 其中G为椭圆曲线基点 , 但知道公钥K和基点G是无法反推出私钥k的 。 椭圆曲线乘法和哈希算法都是这种单向门 。 签名的过程为(其中有小写字母的为数值 , 大写字母为点):
1.取随机数r , 计算椭圆曲线乘法:r*G(x,y)=R(x",y");
2.计算消息m的哈希值h:Hash(m)=h;
3根据随机数r , 哈希值h和私钥k , 计算s=(h+k*Rx)/r , 其中Rx为R点x轴的数值;
4.将消息m(一些需要隐私保护的情况下可能仅发生哈希值h)和签名(Rx,s)发送给验证者 。
需要注意的是第三步s的计算是数值计算 , 利用随机数隐藏私钥 , 并非哈希或椭圆曲线乘法这种单向性的运算 。 因此每次签名随机数r必须更换 , 否则对不同信息用相同的随机数签名就可以推算出私钥 , 而且随机数r的质量将影响私钥的保密性 。
1.3.2公钥验签
验签是通过公钥K(x',y')、消息哈希h和签名值(Rx , s)来推算签名值是否由公钥K对应的私钥k签名 。 验签的过程为:
1.根据收到的消息m , 计算哈希值h:Hash(m)=h;
2.根据收到的公钥、签名和哈希值h计算:R’=hG(x,y)/s+RxK(x',y')/s;
3.验证R‘x是否等于Rx 。
公钥验签的原理是用公钥、签名和哈希值构造出算法 , 使计算结果能回到原来选取的随机数上:
R’=h*G(x,y)/s+Rx*K(x',y')/s
=h*G/s+Rx*(k*G)/s=(h+k*Rx)G/s
=(h+k*Rx)G*(r/(h+k*Rx))
=r*G
因此验签是否成功的标志是R'x和Rx是否相同 。
这里都是最简化的推导方式 , 没有把求模运算和具体的椭圆曲线加法和乘法等涉及到的运算考虑进去 , 实际计算中关于数值的计算要求模 , 因此最后R’可能算出的是R的对称点 , 而对称点的y轴坐标不同但是x轴相同 。 还有 , 数值除法也并不是常规的运算 , 而是将除数转换成模逆元再做乘法 。
2、加密与解密
非对称加密的作用是将信息通过公钥加密传递给私钥持有者 。 非对称加密和签名相反 , 信息是经过隐藏的 , 发送方也并不和身份绑定 , 主要的功能是传输信息而不是确定身份 。 非对称加密的效率比对称加密低很多 , 主要的优势是接收方不需要将秘钥通过交换协议或者直接传输给信息发送方 。 和签名类似 , 非对称加密也有RSA和椭圆曲线的方法 。 加密同样利用算法的单向性 , 使消息和随机数被隐藏起来 , 然后用私钥计算将加密的消息提取出来 。
未央网|区块链技术中的非对称加密算法——签名和加密
文章图片
如图所示 , 蓝线为签名所需要的数据 , 经过单向门的数据可被隐藏 , 未经过单向门的数据需要小心处理;红线是验签的数据 , 这些数据是要传给解密者或者解密者本身持有的 。 解密流程中私钥为解密方单独持有 , 随机数和消息由加密方生成和提供 。
2.1公钥加密
加密也用到单向门的特性将随机数隐藏 , 具体流程为:
1.取随机数r , 计算椭圆曲线乘法:r*G(x,y)=R(x',y');
2.将消息m编码到椭圆曲线上 , 获取椭圆曲线上的点M(x",y");
3.用随机数r和接收方的公钥K , 计算椭圆曲线乘法:r*K(x,y);
4.计算椭圆曲线加法得出加密点S(x"',y"')=M(x",y")+r*K(x,y) , 并和R(x',y')一起发送给接收方;
加密中编码的方式有很多种 , 比如用M点做对称加密的密钥 , 然后将用该密钥加密后的信息一起发送给接收方 , 接收方用私钥解密出M后 , 再用M解密对称加密的信息 。
2.2私钥解密
私钥解密是通过加密内容 , 随机点R和私钥k来还原出编码M的过程 , 具体流程为:
1.根据发送方传输的S(x"',y"') , R(x',y')和接收方自己的私钥k , 计算S(x"',y"')-k*R(x',y')还原M(x",y");
2.用编码M解出消息m;
私钥解密的原理是用私钥和加密相关的消息还原出编码点M:
S(x"',y"')-k*R(x',y')=M(x",y")+r*K(x,y)-k*R(x',y')


推荐阅读