ECC加密算法
Q = kP 并不是简单意义上的数字相乘,而是具有几何意义,下面会对如何计算kP解释
满足4a³+27b²≠0是为了保证椭圆曲线中不存在奇点,即任意点均存在切线(后面会有切线的意义解释)
连接AB直线相交于一个点:
当然也会有两个点所在的直线没有交点
同理可以推出A+A的交点,就是AB两个无限接近,故两点所在的直线即为过A点的切线
我们可以得出2A + A 的结果
所以,我们由以上可以得出,2A和3A点的位置之间没有任何联系,所以我们知道P和Q点,推算出k的值是很难的
加密过程
- 选择一条椭圆曲线Ep(a,b),并取椭圆曲线上一点作为基点P.
- 选定一个大数k作为私钥,并生成公钥Q=kP.
- 加密:选择随机数r,将消息M生成密文C.密文是一个点对,即C=(rP,M+rQ).
- 解密:解密人是拥有私钥k的,So 解密:M + rQ - k(rP) = M +r(kP) - k(rp) = M
以上过程所有参数,只有k是保密的,其余的所有变量(P和Q)都是公开的
存在问题
椭圆曲线都是连续的,并不适合加密,我们要将椭圆曲线变为离散的点.所以只能将椭圆曲线定义在有限域上.(这里可以理解为,处于有限域中的元素,对其进行加减乘除运算的结果还是在这个有限域的集合中,也就是保证了无论对点进行怎样的运算,最后的结果仍然在集合中)
有理数集合,实数集合,复数集合都是域,但是整数集合不是域,因为1/2=0.5 不在整数集合中
有限域的一些定义:
- 域F质包含有限个元素,则称其为有限域
- 有限域中元素的个数称为有限域的阶数
- 每个有限域的阶必为素数的幂,即有限域的阶可表示为p^n(p为素数,n是正整数),该有限域通常称为Galois域(Galois Fields),即为GF(p^n).
对于有限域来说,因为阶数是有限的,所以需要通过取模操作将阶数限制在一定范围内
已知A,B点的坐标值
如何计算出A + B?
例子:基点A(0,1),y² ≡ x³ + x + 1 (mod 23) 求2A a=b=1
属于P=Q,所以k = (3*0 + 1)/2 mod 23 = 1/2 mod 23 = 12
故x3 =
插入问题
分数如何取模运算?
负数如何求模?
如何计算 1/2 mod 23呢,设有n≡1/2 mod 23,于是有2*n ≡ 1mod23 解得n=12,故1/2 mod 23 为 12
负数求模的计算公式为:x mod y = x - y⌊x/y⌋;*
SM2公钥加密算法
私钥db和公钥Pb = [db]G
已知基点G和私钥db求Pb是很容易的;但是已知Pb和基点G求db是极其困难的
A5,A7,A8中的||都是拼接含义
对于A5中的KDF,我们有:
对于c) 如果v | klen的,就正常生成比特串;反之,如果v 不能整除 klenn的,则取最后一次Hai的前r位,r为klen模v的余数