最近学校开了一门mathematics for cryptography的课,主要讲了一些密码学中常用到的数学原理。CSDN上关于RSA的文章中,只看到了关于RSA算法的一些讲解,对于其涉及的数学原理并没有多少介绍,因此想写点东西与大家分享,同时也是为了自己复习和巩固。第一次写文章,可能会有一些问题和不足,希望大家能够指正。此外,这篇文章主要参考了我们老师Zülfükar Saygı(TOBB ETÜ - University of Economics & Technology)的PPT课件,《信息安全原理及应用》第三版(熊平,朱天清)以及《信息安全数学基础——算法、应用与实践》第二版(任伟)。
RSA是1977年由麻省理工学院的Ron Rivest,Adi Shamir和Leonard Adlenman提出的非对称公开密钥密码算法。其可靠性基于大数的因子分解问题。目前为止,仍未找到快速分解因子的算法,所以还没有任何可靠的攻击RSA算法的方式。只要密钥的长度足够长,用RSA加密的信息实际上是不可能破解的。因此,RSA算法已经成为目前应用最广泛的公钥密码。
RSA算法的加密过程如下:
其中{n,e}为公钥,{n,d}为私钥。明文m加密算法为c= m e m^e me mod n,接收方解密方式为m= c d c^d cd mod n。
RSA的算法并不复杂,其工作原理也有很多文章做了解释和证明。为了确保算法的可靠性,需选取足够长的密钥。本文将讲解在足够长的密钥(1024-2048位,约为 1 0 300 10^{300} 10300)的情况下,使用RSA算法运算时涉及到的数学基础,主要有Miller-Rabin检测法、费马小定理、欧拉函数与欧拉定理,中国余数定理以及模重复平方算法。
RSA用到的数学原理涉及到很多数论中的概念。在此做简要说明。
定理:整数a和b,如果存在整数c,使得b=a·c,则b能被a整除,记做a|b。
定义:如果整数p≥2且只能被1和它本身整除,则其为素数,否则为合数(composite)。
定义:a和b的最大公约数是能够同时整除a和b的最大正整数,记做gcd(a,b)
定义:设整数a,b,n(n≠0),如果a-b是n的整数倍,即a=b+kn,k为整数,则a≡1 mod n
定义:如果gcd(a,b)=1,那么:
在RSA算法中,n是由两个素数的乘积来确定的。由于n是公开的,为了避免攻击者用穷举法求出p和q(n=p·q),p和q应足够大。RSA目前建议的密钥长度为1024或2048位。对于一个1024位的密钥而言,p和q的大小在 1 0 100 10^{100} 10100~ 1 0 200 10^{200} 10200之间。目前还没有有效的方法产生任意大小的素数,只能从期望大小的数中进行测试,直到检测到素数为止。目前常用的方法为Miller-Rabin素性检测法。Miller-Rabin检测法可以确定一个整数是合数,但不能确定其一定是素数。不过尽管如此,该算法所产生的数几乎可以肯定是素数。
Miller-Rabin素性检测法主要是依据费马小定理和费马测试,所以先介绍费马小定理
定理:如果p是素数且gcd(a,p)=1,1≤a≤p-1,则 a p − 1 a^{p-1} ap−1≡1 mod p
因此,给定需要判定素性的数n,若能找到一个整数a,使得 a n − 1 a^{n-1} an−1≠1 mod n,则n是合数。
Fermat素性测试:
输入:奇数n≥3
输出:prime/composite
Fermat(n):{
随机选择a,2≤a≤n-2
r= a n − 1 a^{n-1} an−1 mod n;
if r≠1 return composite;
return prime;
}
在费马测试中,如果输出是合数,则n一定是合数。若输出为素数,则有可能为素数。这是因为存在着这样的一些合数n,对于满足gcd(a,n)=1的a,均有 a n − 1 a^{n-1} an−1=1 mod n。这些数被称为Carmichael数,例如561,1105,1729,2465,2821,6601,8911……但这种数比较稀少,对费马测试的准确性准确性影响很小。研究表明,如果算法输出为prime,即通过了素性测试,则n为素数的可能性大于1-1/2,若测试了t次均为prime,则n为素数的可能性大于1-1/ 2 t 2^t 2t。
费马小定理除了可以用在Miller-Rabin检测法中,还被用于计算乘法逆元。当 p取素数时,计算过程如下:
在Fermat测试中,需要计算 a n − 1 a^{n-1} an−1mod n。若结果为1则输出素数,不为1则输出合数。为了简化计算过程,可以采用如下方法。对于n(n>2),若n为偶数,则n必定为合数;n为奇数,则n-1为偶数,设n-1=2t,于是 a n − 1 a^{n-1} an−1= ( a t ) 2 (a^t)^2 (at)2,如果 a t a^t at=±1 mod n,则直接输出素数,没有必要继续计算(因为平方后会得到 a n − 1 a^{n-1} an−1=1 mod n)。进而,如果n-1= 2 k 2^k 2kt(k≥0),则
a n − 1 a^{n-1} an−1= ( ( ( a t ) 2 ) 2 ) 2 … … ) 2 (((a^t)^2)^2)^2……)^2 (((at)2)2)2……)2共k次平方
同前面的分析,如果 a t a^t at=±1 mod n,则必有 a n − 1 a^{n-1} an−1=1 mod n,直接输出素数;否则,在k-1次平方的过程中,有一个为-1,则 a n − 1 a^{n-1} an−1=1 mod n,输出为素数。
根据上面的分析,算法如下。
Miller-Rabin素性测试
输入:奇数n≥3
输出:prime/composite
Miller-Rabin(n){
把n-1写成n-1= 2 k 2^k 2kt,随机选择整数a,1≤a≤n-1
b= a t a^t at mod n;
if b≡1 mod n return prime;
for(i=0,i
else b= b 2 b^2 b2 mod n;
}
return composite;
}
在AES算法中,利用Miller-Rabin检测法求得两个足够大的素数p、q,并且计算出计算n=p·q和Ф=(p-1)(q-1)。其中Ф的值为n的欧拉函数(Euler Phi)。
定义:小于n且与n互素的正整数的个数,记做Ф(n),把Ф(n)称为欧拉函数。
性质:
如果n=p是素数,Ф(n)=n-1
如果n= p e p^e pe是素数的幂,Ф(n)= p e p^e pe- p e − 1 p^{e-1} pe−1
如果gcd(m,n)=1,Ф(n·m)= Ф(n) ·Ф(m)
在AES算法中,因为p和q都是素数,所以Ф(n)= (p-1)(q-1)
定理:对于任意互素的整数a和n,有aФ(n) ≡1 mod n
事实上费马小定理仅是欧拉定理的一种特殊情况(n为素数),所以欧拉定理对于任意的模n都可以求解乘法逆元(用于3.4中计算私钥d)。计算过程如下:
Euler’s Theorem→ a Ф ( n ) a^{Ф(n)} aФ(n)≡1 mod n→a·aФ(n) ≡1 mod n
a − 1 a^{-1} a−1≡ a Ф ( n ) − 1 a^{Ф(n)-1} aФ(n)−1 mod n
例如,求 1 3 − 1 13^{-1} 13−1 mod 49。
Ф(49)= Ф( 7 2 7^2 72)=( 7 2 7^2 72)-( 7 1 7^1 71)=42
Euler’s Theorem→ 1 3 42 13^{42} 1342 ≡1 mod 49
1 3 − 1 13^{-1} 13−1≡ 1 3 42 13^{42} 1342 mod 49
RSA加密和解密时都需要计算模幂,欧拉定理求解逆元时也需要计算模幂。普通的求模幂的方法在幂指数特别大时耗时非常大。因此需要用模平法算法加快计算模幂的速度。在此算法中,将指数e用二进制形式表示,即e = ∑ i = 0 k = e i 2 i \sum_{i=0}^k=e_i2^i ∑i=0k=ei2i,ei等于0或1,则:
a e = ∏ i = 0 k a e i 2 i = ( a 2 0 ) e 0 ( a 2 1 ) e 1 ⋅ ⋅ ⋅ ( a 2 k ) e k a^e=\prod ^k_{i=0}a^{e_i2_i}=(a^{2^0})^{e_0}(a^{2^1})^{e_1}\cdot \cdot \cdot (a^{2^k})^{e_k} ae=∏i=0kaei2i=(a20)e0(a21)e1⋅⋅⋅(a2k)ek
例如,计算 5 110 5^{110} 5110 mod 131.
110=64+32+8+4+2= ( 1101110 ) 2 (1101110)_2 (1101110)2
5 2 5^2 52≡ 25 mod 131 , 5 4 5^4 54≡ 101 mod 131
5 8 5^8 58≡ 114mod 131 , 5 16 5^{16} 516≡ 27 mod 131
5 32 5^{32} 532≡ 74 mod 131 , 5 64 5^{64} 564 ≡ 105 mod 131
所以 5 110 5^{110} 5110≡ 5 64 + 32 + 8 + 4 + 2 5^{64+32+8+4+2} 564+32+8+4+2 ≡ 5 64 5^{64} 564 · 5 32 5^{32} 532 · 5 8 5^8 58 · 5 4 5^4 54 · 5 2 5^2 52 ≡ 105·74·114·101·25 ≡ 60 mod 131
在求得p、q、n、Ф之后,选取一整数e,使得满足1
gcd(a,b)=gcd(b,a mod b)
循环使用该定理,可以得到gcd(a,b) = gcd(b,r1) = ··· = gcd(rk,0) = rk。
其算法描述如下:
A←a,B←b;
若B=0,则返回A=gcd(a,b);
R=A mod B;
A←B;
B←R;
转到2);
例如,
gcd(91,52) = gcd(52,91−52 = 39)
= gcd(39,52−39 = 13)
= gcd(13,39−3·13 = 0) = 13.
gcd(11111,12345) = gcd(1111,12345-1111= 1234)
= gcd(1234,11111−9·1234 = 5)
= gcd(5,1234−5·246 = 4)
= gcd(4,5-4 = 1)
= gcd(1,0)
=1.
在求得e之后,可以计算d,使得e·d≡1 mod Ф。d为e模Ф的乘法逆元,即为e-1。因为e与Ф互素,所以e-1一定存在。使用EA算法求得gcd(e,Ф)=1,再将推导过程一步一步反推回去,可求得两个整数x,y,满足x·e+y·Ф=1→ x·e=-y·Ф+1,即x·e ≡1 mod Ф,e-1=x。即为EEA算法。
在上面的例子中,gcd(91,25)= 13,所以91、25没有逆元
gcd(11111,12345)=1,
则1=5-4=5 -(1234-5·246)=247·5-1234
=247·(11111-9·1234)-1234=247·11111-2224·1234
=247·111 1-2224·(12345-11111)=2471·11111-2224·12345
所以,11111模12345的逆元为2471,12345模11111的逆元为-2224。
至此,我们可以结合欧拉定理和Repeated square-and-multiply algorithm,或者利用EEA算法来计算任意模n的逆元。
中国剩余定理,又称孙子定理,最早见于南北朝的经典数学著作《孙子算经》中的“物不知数”问题:“今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二,问物几何?”
这其实是求解一个一次同余式方程组,即:
x≡2 mod 3
x≡3 mod 5
x≡2 mod 7
《孙子算经》中给出了解法,但只是一个孤立的例子,南宋数学家秦九韶给出了一般性的求解方法。中国古代将这一成果统称为“孙子定理”,在外文文献中常被称为 “中国剩余定理”。它可能是最著名的由中国人给出的算法。下面给出其定理。
定理:设 m 1 m_1 m1, m 2 m_2 m2,…, m k m_k mk是k个两两互素的正整数,m= ∏ i = 1 k m i \prod _{i=1}^{k}m_i ∏i=1kmi, M i M_i Mi=m/ m i m_i mi,则对于任意的整数 a 1 a_1 a1, a 2 a_2 a2,…, a k a_k ak,则同余式组
x≡ a 1 a_1 a1 mod m 1 m_1 m1
x≡ a 2 a_2 a2 mod m 2 m_2 m2
…
x≡ a k a_k ak mod m k m_k mk
有唯一解,即x≡ ∑ i = 1 k M i M − 1 a i \sum _{i=1}^kM_iM^{-1}a_i ∑i=1kMiM−1ai mod n,其中 M i M − 1 M_iM^{-1} MiM−1≡1 mod n。
例如韩信点兵问题,可化为同余式组
x≡1 mod 5
x≡5 mod 6
x≡4 mod 7
x≡10 mod 11
应用CRT,m=5·6·7·11=2310
M 1 M_1 M1=462 M 1 − 1 M_1^{-1} M1−1≡3 mod 5
M 2 M_2 M2=385 M 2 − 1 M_2^{-1} M2−1≡1 mod 6
M 3 M_3 M3=330 M 3 − 1 M_3^{-1} M3−1≡1 mod 7
M 4 M_4 M4=210 M 4 − 1 M_4^{-1} M4−1≡1 mod 11
x≡462·3·1+385·1·5+330·1·4+210·1·10≡6731≡2111 mod 2310
解密者在计算m= c d c^d cd mod n的过程中,可以分别计算m= c d c^d cd mod p和m= c d c^d cd mod q,然后利用CRT计算出m。但CRT算法只能对解密过程加速,不能对加密过程加速,因为加密者只知道公钥(e,n),并不知道n的分解p、q。所以,,为了维护加密者的用户体验,很多情况下RSA的加密密钥e较解密密钥d小。
在RSA算法的求解过程如下,
用Miller-Rabin检测法去选取两个足够大( 1 0 100 10^{100} 10100~ 1 0 200 10^{200} 10200)的素数p、q。
利用p、q计算出n=p·q和n的欧拉数Ф(n)=(p-1)·(q-1)。
随机选取整数e, 利用EA算法计算最大公约数gcd(e,Ф),使得gcd(e,Ф)=1。
使用EEA或者Euler’s Theorem求解d。
解密过程中,可以用到CRT算法来加速解密过程。