公钥加密原理

一、综述(摘自《无线局域网安全-方法与技术》 [1]第53-55页)

密码体制可以划分为对称密码体制和非对称密码体制。对称密码体制又称为单钥密码体制或私钥密码体制,非对称密码体制又称为双钥密码体制或公钥密码体制。在对称密码体制中,加密密钥和解密密钥是一样的,或彼此之间容易相互确定。在公钥密码体制中,加密密钥和解密密钥不同,从一个难以推出另一个。

1976年Diffie和Hellman在“密码学的新方向”[2]一文中提出了公钥密码的思想,开创了公钥密码学的新纪元。公钥密码提出后,立刻受到了人们的普遍关注。从1976年以来,各国学者已经提出了大量公钥密码体制的实现算法。这些算法的安全性都是基于复杂的数学难题。对于某种数学难题,如果利用通用的算法计算出密钥的时间越长,那么基于这一数学难题的公钥密码体制就被认为越安全。根据所基于的数学难题来分类,公钥密码体制可以分为以下三类:

1)  基于大数分解问题(IFP)的公钥密码体制,如RSA体制和Rabin体制。

2)  基于有限域上离散对数问题(DLP)的公钥密码体制,其中主要包括ElGamal类加密体制和签名方案,Diffie-Hellman密钥交换方案,Schnorr签名方案和Nyberg-Ruppel签名方案等。

3)  基于椭圆曲线离散对数问题(ECDLP)的公钥密码体制,其中主要包括椭圆曲线型的Diffie-Hellman密钥交换方案,椭圆曲线型的MQV密钥交换方案和椭圆曲线型的数字签名算法。

利用公钥密码体制,通信双方无需事先交换密钥就可以进行保密通信。公钥密码体制可以提供以下功能:

1)  机密性(Confidentiality)。通过数据加密来保证非授权人员不能获取机密信息。

2)  认证(Authentication)。通过数字签名来验证对方的身份。

3)  数据完整性(Data Integrity)。通过数字签名来保证信息内容不被篡改或替换。

4)  不可抵赖性(Nonrepudiation)。通过数字签名来实现,是发送者不能事后否认他发送过消息,消息的接受者可以向第三方证实发送者确实发出了消息。

公钥密码体制采用的加密密钥(公开钥)和解密密钥(秘密钥)是不同的。由于加密密钥是公开的,密钥的分配和管理就很简单,而且能够很容易地实现数字签名,因此能够满足电子商务应用的需要。在实际应用中,公钥密码体制并没有完全取代对称密码体制,这是因为公钥密码体制是基于某种数学难题,计算非常复杂,它的运行速度远比不上对称密码体制。因此,在实际应用中可以利用二者各自的优点,采用对称密码体制加密文件,而采用公钥密码体制加密“加密文件”的密钥,这就是混合加密体制。混合加密体制较好地解决了运算速度和密钥分配管理的问题。

二、常用公钥技术

定义 陷门单向函数:一个函数f如果对其定义域上任意的x都易于计算,而对于f的值域中几乎所有的y,要计算f-1(y)是不可行的,就称f是单向函数。若某一单向函数加上某一条件后变得可逆,则称之为陷门单向函数,该附加条件就称为“陷门”。

2.1Diffie-Hellman-Merkie

2.1.1简介

Diffie-Hellman算法(简称DH算法)是公钥密码体制的开山鼻祖,至今仍被广泛应用。2002年Hellman追述了Ralph Merkie对公钥密码学的贡献并建议将本算法更名为Diffie-Hellman-Merkie算法。

2.1.2 实例

假设Alice要同Bob协商一个密钥,那么:

1. Alice和Bob选定两个素数p = 23和g = 5;

2. Alice选择一个秘密整数a = 6,计算A = ga modp = 56 mod 23 = 8,然后将A发送给Bob;

3. Bob选择一个秘密整数b = 15,计算B = gb modp = 515 mod 23 = 19,然后将B发送给Alice;

4. Alice计算密钥s = Ba mod p = gba mod p = 196 mod23 = 2;

5.Bob计算密钥s = Ab mod p = gab mod p = 815 mod23 = 2。

Alice和Bob最终都得到了同样的值,因为在mod p下gab和gba相等。 注意a, b和gab = gbamod p是秘密的。其他所有的值:p, g, gamod p以及gb mod p都可以在公共信道上传递。一旦Alice和Bob得出了公共秘密,他们就可以把它用作对称密钥,以进行双方的加密通讯,因为这个密钥只有他们才能得到。当然,为了使这个例子变得安全,必须使用非常大的a, b以及p,否则可以实验所有gab mod 23的可能取值(总共有最多22个这样的值, 就算a和b很大也无济于事)。如果p是一个至少300位的素数,并且a和b至少有100位长,那么即使使用全人类所有的计算资源和当今最好的算法也不可能从g, p和ga mod p 中计算出a。这个问题就是著名的离散对数问题。注意g则不需要很大, 并且在一般的实践中通常是2或者5。

2.1.3 原理

Diffie-Hellman算法的基础是离散对数难题。

离散对数难题:已知素数p, g和整数n满足n = gk mod p从而计算k是困难的。

考察k=ab,如果已知ga mod p和gb mod p,那么(ga)bmod p = (gb)a mod p = gab mod p = gkmod p。

综上所述,(1)已知p, g和k,容易计算出n = gkmod p;反之,已知p, g和n却难以计算出k,所以这是一个单向函数。(2)令k=ab,如果a和b已知,那么容易计算出gab mod p。这是一个陷门。Bingo,我们找到了一个单向陷门函数!

回顾DH算法巧妙之处在于把k变成a和b的乘积s,令s = gab modp,当Alice和Bob分别知道a和b,则他们分别得到gbmod p和ga mod p后就很容易计算出s;而a, b都不可能计算出来,所以DH算法是安全的。


2.2 RSA

2.2.1简介

1977年,Ron Rivest, Adi Shamir和Leonard Adleman在“实现数字签名和公钥密码体制的一种方法”[3]一文中提出了公钥密码算法RSA[1]。它既能用于加密,又能用于数字签名,易于理解和实现,是第一个较为完善的公钥密码体制。


2.2.2 实例

2.2.2.1   加密解密应用

假设Alice要同Bob通信,那么:

1. Alice选定两个素数p = 47, q =59;

2. 计算n = pq = 47 * 59 = 2773;

3. 计算Φ(n) = (p - 1)(q - 1) = 46 * 58 = 2668;

4. 选择一个与Φ(n)互素的素数d = 157;

5. 现在我们需要计算e使得ed ≡ 1(modΦ(n))[2];

5.1 ed ≡1 (modΦ(n)) =>ed - 1 = kΦ(n)=> ed - kΦ(n) =1 => 157e - 2668k = 1

5.2 还需要借助定理:形如ax + by的最小正整数等于gcd[3](a, b)。[参考文献4第21页]

有157e - 2668k = gcd(157, 2668) = 1 => gcd(157, 2668) = 1。

5.3 采用扩展的欧几里得算法[4]计算gcd(157, 2668):

第一步是2668除以157得商16与余数156

         2668 = 16 * 157 + 156

第二步是用前一步的余数156除157得

         157 = 1 *156 + 1

下一步用上一步的除数除以余数

         1 = 1 * 1 + 0

当余数为0时计算结束,倒数第二步的余数即为所求的最大公因数。这是一个无需求助欧几里得算法的显而易见的事实,然而用欧几里得算法计算很重要,因为我们利用中间商和余数来解方程157e - 2668k = 1。首先我们将第一步得到的余数改写成:

         156 = a - 16b (a =2668, b = 157).

将其替换第二步中的156,得:

         b = 1 * (a - 16b) + 1

=>     17b - a = 1

验证一下17 * 157 - 2668 = 1正确。这样我们得到e = 17。

6. Alice发布e和n作为公钥,保留d作为私钥。

7. Bob用公钥加密。例如加密字母’A’ (ASCII码65)。

         C = E(M) = Me(modn) = 6517 mod 2773 = 332

8. Alice收到Bob发回的信息后用私钥解密。

         D(C) = Cd(modn) = 332157 mod 2773 = 65

9. 上述公钥私钥均是Alice的,Bob若要与Alice通信需要生成自己的公钥私钥。

 

2.2.2.2   数字签名应用

1. Alice对信息M做Hash,得到字符串SAlice

2. Alice用自己的私钥加密SAlice,得到CAlice

3. Alice将M,CAlice和自己的公钥发给Bob;

4. Bob对M做同样的Hash,得到字符串SBob

5. Bob用Alice的公钥解密CAlice得到SAlice

6. Bob比较SAlice和SBob,如果不同则认为信息被篡改了。


2.2.3 原理

先介绍数论中的欧拉函数、Φ函数公式、欧拉公式和费马小定理:

欧拉函数:对于整数m,在0与m之间且与m互素的整数个数是个重要的量,我们赋予这个量一个名称:

         Φ(m) = #{a: 1 ≤ a ≤ m, gcd(a, m) = 1}

函数Φ叫做欧拉函数。注意对于素数p,每个整数1 ≤ a< p都满足gcd(a, p) = 1,所以对素数有Φ(p) = p - 1。

Φ函数公式:(a)如果p是素数且k≥1,则Φ(pk) = pk- pk-1

                            (b)如果gcd(m, n) = 1,则Φ(mn) = Φ(m)Φ(n)。

欧拉公式:如果gcd(a, m) = 1,则aΦ(m) ≡ 1(modm)。

费马小定理:设有素数p,如果gcd(a, p) = 1,则ap-1 ≡ 1 (mod p)。

 

设整数M与整数n互素,根据欧拉公式有:

         MΦ(n) ≡ 1(modn)

在RSA算法中n = pq,这里p和q都是素数,对应的Φ(p) = p - 1,Φ(q) = q - 1。根据Φ函数公式(b)有Φ(n) = Φ(pq) = Φ(p)Φ(q) = (p - 1)(q - 1) = n - (p +q) + 1。

 

接着我们令d与Φ(n)互素,试图寻找e使得ed ≡1(mod Φ(n)[5]。如2.2.2所示,通过扩展的欧几里得算法我们可以快速计算e。

RSA算法追求的目标是D(E(M)) = M,E(D(M)) = M,我们考察是否达到了这个目标。

D(E(M)) ≡ (E(M))d ≡ (Me)d (mod n) = Med (mod n)

E(D(M)) ≡ (D(M))e ≡ (Md)e (mod n) = Mde (mod n)

这里Med ≡ MkΦ(n) + 1 (mod n) (k ∈ Z)。

再次考察p,根据费马小定理有Mp-1≡ 1 (mod p),等式两边同时取k(q-1)次乘方有

         Mk(p-1)(q-1)≡ 1k(q-1)(mod p)

=>     MkΦ(n) ≡ 1(mod p)

根据同余式的性质(v)[参考文献5第58页事实2.112]:若a ≡ a1(modn), b ≡ b1(modn),则a + b ≡ a1 + b1 (mod n),且ab ≡ a1b1(modn)。我们再在等式两边同时乘以M有:

         MkΦ(n) + 1 ≡ M(mod p)

同样,有MkΦ(n) + 1 ≡ M (mod q)。

再根据同余方程组的性质[参考文献5第59页事实2.123]:若gcd(n1, n2) = 1,则同余方程组x ≡ a(mod n1),x ≡ a (mod n2)有唯一解x ≡ a(mod n1n2)。有MkΦ(n) + 1 ≡ M(mod n)。至此我们得出结论:Med≡ Mde ≡ M (mod n),目标达到!

这种加密方案安全吗?假设你截获一条信息是用模n与指数k加密的。破译密码有多难呢?目前解密的唯一方法是寻找Φ(n)的值。如果n是素数p和q的乘积,则

         Φ(n) = (p - 1)(q - 1) = m - (p + q) + 1

由于n已知,只需求出p + q的值。求出p + q的值则还可以间接确定p和q,因为它们是二次方程X2- (p + q)X + m = 0的根。如果n很大,目前的技术还不能分解之。例如n是200位的数,需要约3.8 * 109年才能分解。简而言之,容易将两个大数乘起来,但是很难将大数分解因数。


3.参考文献

1.      马建峰,朱建明:无线局域网安全——方法与技术,机械工业出版社,2005

2.      Whitfield Diffie, Martin E.Hellman: New Directions in Cryptography, IEEE Transactions on InformationTheory, Vol.IT-22, No.6, 1976, pp.644-654

3.      Ron L. Rivest, Adi Shamir,Leonard Adleman: A Method for Obtaining Digital Signatures and Public-KeyCryptosystems, Communications of the ACM. Feb., 1978 21(2)pages 120-126

4.      Joseph H. Silverman著,孙智伟,吴克俭,卢青林,曹慧琴译:数论概论,机械工业出版社,2008

5.      Alfred J. Menezes, Paul C. vanOorschot, Scott A. Vanstone著,胡磊,王鹏等译:应用密码学手册,电子工业出版社,2005



[1] RSA是三位作者姓氏的首字母缩写。

[2] 同余式:如果m整除a - b,则称a与b模m同余并记为a ≡b(mod m)。

[3] gcd(greatest common divisor): 最大公因数。

[4] 欧几里得算法:要计算两个整数a和b的最大公因数,先令r-1= a且r0 = b,然后计算相继的商和余数ri-1 = qi+1 × ri + ri+1 (i = 0, 1, 2, …)直到某余数rn+1为0.最后的非零余数rn就是a与b的最大公因数。[4]

[5] 根据参考文献5第58页事实2.117,若gcd(d, Φ(n)= 1,则e一定存在。

你可能感兴趣的:(计算机)