目录
概述
密钥是需要定期更换的。如果采用对称密钥体制(分组密码和序列密码)更换密钥以及相应的“密钥分发”工作量相当大。
由于对称密码在实际应用中“密钥分发”的问题,非对称密码在这方面相对安全。
1976年,Diffie,Hellman发表了非对称密码的奠基性论文《密码学的新方向》,建立了公钥密码的概念。
序列密码在加密和解密时,无论是种子密钥还是生成密钥流,都是一样
分组密码初始密钥是一样的,子密钥使用顺序相反或者可以互推。
而非对称密码不一样,公钥公开,私钥藏好。
只有持有私钥的才能解密。
对称密码体制和非对称密码体制配合,对称密码加密速度快,但密钥分发困难,公钥密码加密速度慢,基本不存在密钥分发问题。可以用公钥密码传递对称密码的密钥,完成密钥的分发,之后运用对称密码进行大规模传输。
分类:基于大整数难分解问题(RSA,Rabin。基于离散对数难题ElGamal。基于椭圆曲线离散对数的密码体制。
RSA
大整数难分解问题:
已知大整数N是两个大素数的乘积。求大素数p和q使得N=p*q。
密钥的产生
选择两个满足需求的大素数p和q,n=p*q计算φ(N) = (P-1)(Q-1) 其中φ(N)是n的欧拉函数。
选一个整数e,满足1<e<φ(N),且gcd(φ(N),e)=1,e 与 φ(n) 互质。gcd求最大公因数
取d,可以使得 ed 除以 φ(n) 的余数为 1
( 1<d<e,且ed mod φ(n) = 1 )
以{e,n}为公开密钥,{d,n}为私密密钥。
加密:
c:密文
m:明文
加密:c = m^e mod N
解密:
解密:m = c^d mod N
RSA准确性证明:
证明 m 经加解密后还是 m,
在实现RSA算法时,在提高指数运算速度上,可以运用膜重复的算法
将e表示为二进制形式 bk bk-1 .。。。。。b0
a为明文,b为e
ElGamal:
基于离散对数难题的公钥密码体制:
离散对数问题:已知大素数p,y属于{1,2,。。。。,p-1}。g是膜p的本原元(即ord p(g)=p-1(g能被p^p-1整除)),由y,g,p求x使得y=g^X(modp)
1、ElGamal密钥生成
首先选择一个大素数p,g是模p的本原元α,再选取一个随机数x,1<x < p-1, 计算 y = g^x ( mod p ),则其公钥为 y,g,p。私钥是x,g,p。
本原元的概念:若模n下a的阶d=φ (n),a就是n的本原元(又称为原根)。
先是阶的概念:模19下7的阶为3(7^1=7mod19,7^2=11mod19,7^3=1mod19,7^4=7mod19....)
本原元并不唯一
2、ElGamal加密
(1)对于明文M加密,随机地选取一个整数k,2≤k≤p-2
(2)C1=g^k mod p
(3)C2=My^k mod p
(4)密文为(C1,C2)
3、ElGamal解密
由密文可得明文M,M=C2/(C1^d) mod p
缺点:密文长度是所对应的明文长度的两倍。
椭圆密码曲线密码ECC:
安全性:基于椭圆曲线离散对数问题的困难性
已知椭圆曲线Ep(a,b),以及两个点Q R属于Ep(a,b),由R Q Ep(a,b)求K属于Z 使得R=KQ。
K=kG [其中 K,G为Ep(a,b)上的点,k为小于n(n是点G的阶)的整数]
不难发现,给定k和G,根据加法法则,计算K很容易;但给定K和G,求k就相对困难了。
这就是椭圆曲线加密算法采用的难题。
我们把点G称为基点(base point),
k(k<n,n为基点g的阶)称为私有密钥(privte key),
k称为公开密钥(public="" key)。<="" p="">
现在我们描述一个利用椭圆曲线进行加密通信的过程:
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进行解码就可以得到明文。
在这个加密通信中,如果有一个偷窥者H ,他只能看到Ep(a,b)、K、G、C1、C2 而通过K、G 求k 或通过C2、G求r 都是相对困难的。因此,H无法得到A、B间传送的明文信息。
设私钥、公钥分别为k、K,即K = kG,其中G为G点。
公钥加密:
选择随机数r,将消息M生成密文C,该密文是一个点对,即:
C = {rG, M+rK},其中K为公钥
私钥解密:
M + rK - k(rG) = M + r(kG) - k(rG) = M
其中k、K分别为私钥、公钥。
摘抄于椭圆曲线