一个利用椭圆曲线进行加密通信的过程:
1、用户A选定一条椭圆曲线Ep(a,b),并取椭圆曲线上一点,作为基点G。
2、用户A选择一个私有密钥(随机数)k,并通过某种快速算法生成公开密钥K=kG。
3、用户A将Ep(a,b)和点K,G传给用户B。
4、用户B接到信息后 ,将待传输的明文编码到Ep(a,b)上一点M,并产生一个随机整数r(r<n)。
5、用户B计算点P1=M+rK;P2=rG。
6、用户B将P1、P2传给用户A。
7、用户A接到信息后,计算P1-kP2,结果就是点M。
因为P1-kP2=M+rK-k(rG)=M+rK-r(kG)=M,再对点M进行解码就可以得到明文。
在这个加密通信中,如果有一个偷窥者H ,他只能看到Ep(a,b)、K、G、P1、P2。
H有两种方式获得明文M,一是通过K、G求k,二是通过P2、G求r,都是相对困难的,都需要通过穷举法暴力破解k或r,算法复杂度为O(n)。而在做乘法的时候,知道k和G求K,可以有捷径,比如说通过倍乘相加的方式,这样可以将算法复杂度减少到O(logn)。因此,H很难得到A、B间传送的明文信息。
简单来说,假如有种运算,乘法很容易,但是不存在除法。令G=7,私钥=100,计算出公钥=700,发给前端是7和700。
前端要发送的密文假设是28,那么他寻找一个随机数r,发给后端28+700r 以及 7r
后端拿到28+700r和7r后,可以很轻松地计算出密文28= 28+700r- 7r*私钥100
H想要破解,只有通过700、7求乘数100,或者通过7r、7来求乘数r的值(M=P1-rK),只能穷举破解。
SM2非对称加密的结果由C1,C2,C3三部分组成。最开始的国密标准的结果是按C1C2C3顺序的,新标准的是按C1C3C2顺序存放的。
其中C1是加密方根据生成的随机数r,计算出的的椭圆曲线点C1 = rG
C2是密文数据,首先计算rK=X,再以X的两坐标为参数,以某种方式计算出一个字节流t,将字节流t异或明文M获得密文C2,C2=F(rK) ^ M
C3是SM3的摘要值。
解密:因为 M = F(rK) ^ C2,又因为kC1 = rkG = rK,所以 M = F(kC1) ^ C2