RSA和DH 密钥交换算法

RSA和DH 密钥交换算法
RSA和DH 密钥交换算法

查看文章

RSA和DH 密钥交换算法

2008年11月21日星期五 09:54

RSA

RSA 用到了数论中的三个基本定理:费马小定理、欧拉定理和中国剩余定理(几乎处处都在),和一个古典难题:大整数分解问题。如果你是数学系的学生,对这些概念一定不会陌生。

费马小定理:若 p 是素数,a 是正整数且不能被 p 整除,则: a p-1= 1(mod p)。或者另一种形式:a p=a(mod p),这种形式不要求 a 与 p 互素。

欧拉定理:对任意互素的 a 和 n,有 aΦ(n) = 1(mod n)。其中,Φ(n)是欧拉函数,即小于 n 且与 n 互素的正整数的个数。

大整数分解问题:将两个整数乘起来是简单的,但是将一个整数分解为几个整数的乘积是困难的,尤其是当这个数比较大的时候。迄今为止没有有效的算法来解决这个问题,甚至我们连这个问题的计算复杂度量级是多少都不知道。

那么 RSA 算法是什么样的呢?

密钥的产生:

1. 选择两个素数 p 和 q.

2. 计算 n = p*q.

3. 计算Φ(n) = (p-1)(q-1) (这是欧拉函数的性质)

4. 选择 e<Φ(n) 并使得其与Φ(n) 互素。

5. 确定 d<Φ(n) 并使得 d*e = 1(mod Φ(n))。

6. 这时候,私钥就是{d, n},公钥就是{e, n}。

加密算法:

假设 M 是明文(M

解密算法:

假设 C 是密文,那么明文就是 M = C d mod n。

我们来证明一下算法是否正确,由于 C d = M e*d = M k*Φ(n)+1 (mod n)。

如果 M 和 n 是互素的,显然直接由欧拉定理我们就能得到:

C d = M k*Φ(n)*M1 = M (mod n) = M

说明算法是正确的;

如果 M 和 n 不互素,由于 n 是两个素数 p 和 q 的乘积且 M

e*d = 1(mod (p-1)) 且 e*d = 1(mod (q-1))

则 e*d 可以写成: e*d = k*(p-1)+1, e*d = h*(p-1)+1

由费马小定理,我们有:M e*d = M k*(p-1)+1 = M(mod p) 和 M e*d = M h*(q-1)+1 = M(mod q)。

由于 p 和 q 均为素数,且 p, q 均整除 M e*d-M,所以我们有:

C d = M e*d = M (mod p*q) = M (mod n) = M

从上面我们可以看到 RSA 算法实现了加密和解密使用不同密钥,而且证明了这个算法的正确性。但 RSA 算法要想实用,光有正确性还不够,最重要的一点是安全性,即从公钥{e, n}无法推导出私钥{d, n}。在 RSA 算法中我们可以看到,关键要知道Φ(n),知道了Φ(n),使用欧几里德算法就能求出 e 的逆元,就得到了用户的私钥{d, n}。要求出Φ(n),就必须知道 p,q,但 p,q 是不公开的,仅仅知道 p,q 的乘积 n 去求 p,q,根据大整数分解古典难题,当 n 比较大时其分解在计算上是不可行的。这就保证了 RSA 算法的安全性。

而且 RSA 算法是可逆的,所以它就有能力同时实现加密和签名的功能。由于公钥是公开的,每个人都可以用你的公钥加密一段信息发给我,而私钥是保密的,所以只有你能看到别人用你的公钥加密的消息;而也因为可逆性,如果你用私钥解密一段明文(实际是加密),所有人都可以用你的公钥加密它来得到明文(实际是解密),因为私钥只有你一个人知道,这个消息只有可能是你发出的,就相当于你对这段明文做了一个签名。

DH 密钥交换算法

DH 密钥交换算法较 RSA 算法更为简单,它也是基于数论中的一个古典难题:离散对数问题。

离散对数问题:若 p 是素数,p 已知,考虑方程 y = g x mod p,给定 g,x 求 y 是简单的,但给定 y,g 求 x,即求 x = log

y mod p,在计算上是不可行的。

g,p

DH 密钥交换算法的描述如下:

已知公开的素数 p 和 p 的本原根α

1. 用户 A 选择秘密的 Xa

2. 用户 B 选择秘密的 Xb

3. A 和 B 分别计算 Ka = (Yb)Xa mod p 和 Kb = (Ya)Xb mod p,就同时得到了共享的密钥 K=Ka=Kb,然后就可以用 K 进行加密传输了。

DH 密钥交换算法的优点在于:双方在通信前不需要知道任何共享的密钥,而是通过公开的 p 和α协商出一个密钥来进行加密通信。

先看一下算法的正确性,Ka = Kb 是否成立:

Ka = (Yb)Xa = (αXb)Xa = αXa*Xb (mod p)

Kb = (Ya)Xb = (αXa)Xb = αXa*Xb (mod p)

Bingo! Ka 和 Kb 是相同的。

再来看一下算法的安全性,就是能否从公开的信息推导出 K 来:

由于密钥是 K = αXa*Xb,那么攻击者必须知道 Xa 和 Xb 才能得到共享的密钥 K,而公开的信息只有 Ya 和 Yb,由离散对数问题,从 Ya,Yb 求出 Xa,Xb 在计算上是不可行的,就保证了算法的安全性。

公钥算法

又称不对称加密算法,是一种加密算法,它使用两把完全不同但又是完全匹配的一对钥匙:公钥和私钥。在使用不对称加密算法加密文件时,只有使用匹配的一对公钥和私钥,才能完成对明文的加密和解密过程。加密明文时采用公钥加密。(使用一对密钥进行加密和解密过程的算法),一般用来交换密钥。

广泛应用的不对称加密算法有RSA算法和美国国家标准局提出的DSA。

Diffie-Hellman算法是一个用于密钥交换的算法。仅仅是用于密钥交换而已哦。加密就不行啦.

Whitefield与Martin Hellman在1976年提出了一个奇妙的密钥交换协议,称为Diffie-Hellman密钥交换协议/算法(Diffie-Hellman Key Exchange/Agreement Algorithm).这个机制的巧妙在于需要安全通信的双方可以用这个方法确定对称密钥.然后可以用这个密钥进行加密和解密.但是注意,这个密钥交换协议/算法只能用于密钥的交换,而不能进行消息的加密和解密.双方确定要用的密钥后,要使用其他对称密钥操作加密算法实际加密和解密消息.

(尽管Diffie-Hellman密钥交换协议/算法使用了数学原理,但是很容易理解.)

Diffie-Hellman

由Whitfield Diffie和Martin Hellman在1976年公布的一种密钥一致性算法。Diffie-Hellman是一种建立密钥的方法,而不是加密方法。然而,它所产生的密钥可用于加密、进一步的密钥管理或任何其它的加密方式。Diffie-Hellman密钥交换算法及其优化首次发表的公开密钥算法出现在Diffie和Hellman的论文中,这篇影响深远的论文奠定了公开密钥密码编码学.由于该算法本身限于密钥交换的用途,被许多商用产品用作密钥交换技术,因此该算法通常称之为Diffie-Hellman密钥交换.这种密钥交换技术的目的在于使得两个用户安全地交换一个秘密密钥以便用于以后的报文加密.

相关主题
相关文档
最新文档