对称算法的效率高,但是密钥的传输需要另外的通道。非对称算法RSA和DH可以解决密钥的传输问题。
DH密钥交换算法的作用是使通信双方可以在不安全的通道中建立一个相同的密钥,用于通信加密。
基本原理:
假设通信双方A和B,选定一个数g,g是可公开的
1.A随机选择一个数a,a是保密的
2.A计算g^a发送给B
3.B随机选择一个数b,b是保密的
4.B计算g^b发送给A
5.A收到B发送的g^b后,利用自己的密钥a,计算(g^b)^a
6.B收到A发送的g^a后,利用自己的密钥b,计算(g^a)^b
7.可以看出 (g^b)^a=(g^a)^b ,因此A和B就有了一个相同的“密钥”
通过上述通信过程可以看出,g,a和b是公开的,密钥可以通过g^a^b求得,因此,为了能够密钥不被破解,有以下新的计算方法:
模运算法则:
假设通信双方A和B,选定一个数g,一个质数p,g和p是可公开的
1.A随机选择一个数a,a是保密的
2.A计算(g^a)%p发送给B
3.B随机选择一个数b,b是保密的
4.B计算(g^b)%p发送给A
5.A收到B发送的(g^b)%p后,利用自己的密钥计算((g^b)%p)^a%p
6.B收到A发送的(g^a)%p后,利用自己的密钥计算((g^a)%p)^b%p
7.通过计算可以得到相同的密钥 ((g^b)%p)^a%p=((g^a)%p)^b%p=g^(a*b)%p ,因此A和B具有相同的密钥
整个通信过程中,g,a,b,p是公开的,假设 g^a%p=q,a=log(g,n*p+q),只能将n的值逐个代入才能求得a,因此 ,当a ,p是很大的质数时,通过g,p,很难得到a,同理,通过g,p也很难得到b
需要注意的是质数p不是随机选择的,生成的随机数a和b也要尽可能的随机,否则会很容易破解密钥
从上可以看出,多个通信方也可以使用上述的DH密钥交换算法
DH密钥交换算法无法验证通信双方的身份,因此,不能抵御中间人的攻击
------------------------------------------------------------------------------------------------
RSA算法的基本原理是基于大数难分解,通信方A产生一个密钥k,用通信方B的公钥加密K,然后将得到的密文发送给B,B用自己的私钥解密收到的密钥,就可以得到密钥了,RSA可以用于认证、密钥传输
RSA的密钥生成步骤:
1.通信方A随机选择两个不等的质数p和q
2.计算p和q的乘积n
3.计算n的欧拉函数φ(n)
4.随机的选择一个整数e,1<e<φ(n),并且e与φ(n)互质
5.计算e对于φ(n)的模反元素d即
ed=1(modφ(n))---->ed-1=kφ(n)
模翻元素d也就是使 ex+φ(n)y=1
6.将n和e封装成公钥,n和d封装成私钥
在RSA算法中,用到了p,q,n,e,d,φ(n),其中只有n和e是公开的,其中最为关键的是d,因为n,d组成了密钥
仅通过n和e推到d:
a.ed=1(modφ(n)) ------>需要知道e和φ(n)
b.φ(n)=(p-1)(q-1) ----------->需要知道p和q
c.n=pq ------->需要对n进行因式分解 才能得到p和q
因此,如果n是可以被分解的,则可以推算出d,这要造成了密钥会被破解,但是在实际过程中,对大整数的因数分解很难
加密要用公钥:
假设A要像B发送加密信息m,则A需要用B的公钥对m进行加密,m必须是整数,且m必须小于n
加密的过程就是:
m^e=c(mod n) ,将加密后的信息c发送给B
解密要用私钥:
B收到A发送过来的c之后,就用自己的私钥(n,d)进行解密,
c^d=m(mod n) ,因此B可以知道加密前的信息m
公钥(n,e)只能加密小于n的整数m,那么如果要加密大于n的整数,有两种方法:
1.把长信息划分成若干段短消息,每段分别加密
2.选择对称性加密方法,用这种方法的密钥加密信息,再用RSA公钥加密对称性加密算法的密钥。
--------------------------------------------------------------------------------------------------------------
椭圆曲线加密算法
椭圆曲线在射影平面上满足方程:y2Z+a1xyz+a3yz2=x3+a2x2z+a4xz2+a6z3
运算法则:任意取椭圆曲线上两点P 、Q (若PQ重合,则做p的切线) 做支线交于椭圆曲线的另一点R‘,过R‘做y轴平行线交于R,规定P+Q=R’
椭圆曲线无穷远点0∞与椭圆曲线上一点P的连线交于P‘,过P‘做y轴的平行线交于P,所以有无穷远点0∞+P=P,无穷远点成为零元,同时,P‘称为P的负元
根据这个运算法则可以得到:如果椭圆曲线上的三个点A B C处于同一直线,那么A+B+C=0∞
k个相同的点P相加,记作kP, P+P+P=2P+P=3P
对于有限域Fp,这个域只有有限个元素:
1.Fp中只有p个元素,p为素数,0,1,2,....,p-2,p-1
2.Fp的加法法则为 a+b=c(mod p),即(a+c)mod p 与 c mod p相同
3.Fp的乘法法则是axb=c(mod p)
4.Fp的除法法则是a/b=c(mod p),即axb-1=c(mod p) ,b-1也是一个0到p-1之间的整数,但满足bxb-1=1(mod p)
Fp的单位元为1,零元是0
并不是所有的椭圆曲线都适合加密。y2=x3+ax+b是一类可以用来加密的椭圆曲线,也是最为简单的一类,将这类椭圆曲线定义在Fp上,其中P需要满足,
选择两个满足下列条件的小于P(p为素数)的非负整数a、b
4a3+27b2≠0(mod p) 则满足下列方程的所有点(x,y),再加上无穷远点0∞,构成一条椭圆曲线
y2=x3+ax+b(mod p)
其中x 和y属于 0到p-1之间的整数,并且将这条椭圆曲线标记为Ep(a,b)
椭圆曲线上的点结论:
1.无穷远点0∞是零元,有0∞+0∞=0∞,0∞+P=P
2.P(x,y)的负元是(x,-y),有p+(-p)=0∞
3.P(x1,y1),Q(x2,y2)和R(x3,y3))有如下关系:
x3=k2-x1-x2 mod p
y3=k(x1-x3)-y1 (mod p)
其中如果P=Q 则k=(3x2+a)/2y1 若 p≠Q 则 k=(y2-y1)/(x2-x1)
对于以下等式:
K=kG ,其中 K G为Ep(a,b)上的点,k为小于n(n为点G的阶)的整数
给定k G,根据加法法则,计算K很容易,但给定K和G,求k就相对困难了
椭圆曲线进行加密通信的过程:
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计算点C1=M+rK C2=rG
6.用户B将C1 C2传给用户A
7.用户A接到信息后,计算C1-kC2 结果就是点M 。
C1-kC2=M+rK-k(rG)=M+rK-r(kG)=M
再对M进行解码就可以看见明文了
密码学中,描述一条Fp上的椭圆曲线,常用到的六个参量
T=(p,a,b,G,n,h)p,a,b用来确定一条椭圆曲线 G为基点 n为点G的阶 h是椭圆曲线上所有点的个数m与n相除的整数部分
这几个参量取值的选择 一般满足以下条件:
1.p越大越安全。但越大,计算速度会变慢,200位左右就可以满足一般安全要求
2.p≠n*h
3.pt≠1(mod n)1≤t<20
4.4a3+27b2≠0 (mod p)
5.n为素数
6.h≤4
椭圆曲线在软件注册保护中的应用:
软件作者按如下方法制作注册机(签名过程)
1.选择一条椭圆曲线Ep(a,b) 和基点G
2.选择私有密钥k(k<n,n为G的阶),利用基点G计算公开密钥K=kG
3.产生一个随机整数r(r<n)计算点R=rG
4.将用户名和点R的坐标值x和y作为参数 计算SHA,Hash=SHA(username,x,y)
5.计算sn=r-Hash*k(mod p)
6.将sn和Hash作为用户名username的序列号
软件验证过程如下:(软件中存有椭圆曲线Ep(a,b) 和基点G 公开密钥K)
1.从用户输入的序列号中,提前sn以及Hash
2.计算点R=sn*G+Hash*k(mod p)如果sn和Hash正确 其值等于软件作者签名过程中点R(x,y)的坐标 因为
sn=r-Hash*k(mod p)
sn*G+Hash*K=R
3.将用户名和点R的坐标值x y作为参数 计算H=SHA(username,x,y)
4.如果H=hash则注册成功否则失败
作者签名过程中用到了 椭圆曲线Ep(a,b) 基点G 私有密钥k 及随机数 r
验证用到了 椭圆曲线Ep(a,b) 基点G 公开密钥K