签名算法多次用到了算法的单向性,可以看做一个单向的门,经过计算相当于从一边穿过单向门,但是并不能通过运算再走回去。比如私钥为k,公钥K可通过椭圆曲线乘法算出: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')/s3.验证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和椭圆曲线的方法。加密同样利用算法的单向性,使消息和随机数被隐藏起来,然后用私钥计算将加密的消息提取出来。如图所示,蓝线为签名所需要的数据,经过单向门的数据可被隐藏,未经过单向门的数据需要小心处理;红线是验签的数据,这些数据是要传给解密者或者解密者本身持有的。解密流程中私钥为解密方单独持有,随机数和消息由加密方生成和提供。
私钥解密是通过加密内容,随机点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')= M(x",y") + r * k * G - k * r * G(x',y')= M(x",y")然后根据M还原出加密的消息。