RSA公钥加密算法:
历史背景:最初的公钥方案于1977年由Ron Rivest、Adi Shamir 和Len Adleman在MIT
中提出的。
原理:对于某一明文块M和密文块C,
加密:C=Me mod n
解密:M=Cd mod n
密钥的生成:
1、 选择p、q:p、q都是素数且p不等于q
2、 n=p*q
3、 计算φ(n), φ(n)=(p-1)(q-1)
4、 计算整数e :gcd(φ(n),e)= 1:1 < e < φ(n) 即e和φ(n)互素且e比φ(n)小
5、 计算d:de mod φ(n)=1
6、 公钥:KU={e、n}
7、 私钥:KR={d、n}
密钥生成算法的证明:
M= Cd mod n =(Me mod n)d mod n= Med mod n
现证明(Med-1)mod n =1 (1)即可
Med-1= Mφ(n)*k
Mφ(n)*k mod n = (Mφ(n) mod n)kmod n
= ((Mp-1 mod n)q-1 mod n)k mod n
= ((Mp-1 mod p)q-1mod n)k mod n
因为p为素数,所以由费马定理可以得到:Mp-1 mod p=1
(1)式得证
Diffie-Hellman密钥交换:
目的:使得两个用户能够安全的交换密钥,供以后传递消息时使用。
数论基础:定义素数p的本原根,它是一个整数,且它的幂能生成1~p-1所有整数的数。设p
的本原根 为a,那么有:a mod p、a2 mod p、……、ap-1modp 各不相同,
但他们组成了1~p-1之间整数的置换。且对于任意小于p的整数b和p的本原根a,
能找到位于0与p-1之间唯一的指数 i 有 b=aimod p。
算法如下:假设有两个用户A和B,他们之间先互相公开素数p和p的本原根a,首先A和B各选
择一个随机整数XA与XB,并分别计算:YA = aXA mod p,YB = aXBmod p,然后
公开YA和YB,最后 双方算得密钥:K=(YB)XA mod p =(YA)XB mod p。
算法证明:K=(YB)XA mod p
=(aXB mod p)XA mod p
= aXA*XB mod p
=(aXA mod p)XB mod p
=(YA)XB mod p
用途:
1、 简单的密钥交换协议:假设用户A希望能与用户B建立连接,并在此连接上用
密钥加密消息,那么首先A生成一个一次性随机数XA计算出YA发给B,B随
机生成XB计算出YB发给A,这样两个人就都能计算出密钥了。
2、 一组用户各自生成持续时间很长的X,并计算出Y,将所有Y以及p和a都放入中
央目录里面,任何时候有人想给对方发送加密消息,只需要到中央目录中去取
对方的Y,算出密钥即可。这种方法提供保密性和一定程度上的认证。
缺陷: 不能有效防范中间人攻击。