前言
最近学校开了一门mathematics for cryptography的课,主要讲了一些密码学中常用到的数学原理。CSDN上关于RSA的文章中,只看到了关于RSA算法的一些讲解,对于其涉及的数学原理并没有多少介绍,因此想写点东西与大家分享,同时也是为了自己复习和巩固。第一次写文章,可能会有一些问题和不足,希望大家能够指正。此外,这篇文章主要参考了我们老师Zülfükar Saygı(TOBB ETÜ - University of Economics & Technology)的PPT课件,《信息安全原理及应用》第三版(熊平,朱天清)以及《信息安全数学基础——算法、应用与实践》第二版(任伟)。
1.RSA简介
RSA是1977年由麻省理工学院的Ron Rivest,Adi Shamir和Leonard Adlenman提出的非对称公开密钥密码算法。其可靠性基于大数的因子分解问题。目前为止,仍未找到快速分解因子的算法,所以还没有任何可靠的攻击RSA算法的方式。只要密钥的长度足够长,用RSA加密的信息实际上是不可能破解的。因此,RSA算法已经成为目前应用最广泛的公钥密码。
RSA算法的加密过程如下:
- 选择两个足够大素数p、q
- 计算n=p·q Ф=(p-1)(q-1)
- 选择一个数e,满足1<e<Ф,且gcd(e,Ф)=1
- 计算d,使得e·d≡1 mod Ф
其中{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检测法、费马小定理、欧拉函数与欧拉定理,中国余数定理以及模重复平方算法。
2.数论基础
RSA用到的数学原理涉及到很多数论中的概念。在此做简要说明。
2.1 整除(Divisibility)
定理:整数a和b,如果存在整数c,使得b=a·c,则b能被a整除,记做a|b。
2.2 素数(Prime)
定义:如果整数p≥2且只能被1和它本身整除,则其为素数,否则为合数(composite)。
2.3 最大公约数(Greatest Commom Divisor,gcd)
定义:a和b的最大公约数是能够同时整除a和b的最大正整数,记做gcd(a,b)
2.4 同余(Congruence theorem)
定义:设整数a,b,n(n≠0),如果a-b是n的整数倍,即a=b+kn,k为整数,则a≡1 mod n
2.5 乘法逆元(Multiplicative Inverse Elements)
定义:如果gcd(a,b)=1,那么:
- 存在 a − 1 a^{-1} a−1,使得a·a-1≡1 mod b,即(a· a − 1 a^{-1} a−1)mod b=1;
- 存在 b − 1 b^{-1} b−1,使得b·b-1≡1 mod a,即(b· b − 1 b^{-1} b−1)mod a=1。
把 a − 1 a^{-1} a−1 称为a模b的乘法逆元, b − 1 b^{-1} b−1称为b模a的乘法逆元。一般而言,如果a与n是互素的,即gcd(a,n)=1,那么a模n的乘法逆元a-1≡x mod n有唯一解;否则,a-1≡x mod n无解。
3.数学定理
3.1 Miller-Rabin检测法和费马小定理(Fermat’s Little Theorem,FLT)
在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检测法可以确定一个整数是合数,但不能确定其一定是素数。不过尽管如此,该算法所产生的数几乎可以肯定是素数。
3.1.1费马小定理(Fermat’s Little Theorem)
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取素数时,计算过程如下:
- p是素数且gcd(a,p)=1
- FLT→ a p − 1 a^{p-1} ap−1≡1 mod p→a· a a − 2 a^{a-2} aa−2≡1 mod p
- a p − 1 a^{p-1} ap−1≡ a p − 2 a^{p-2} ap−2 mod p
3.1.2 Miller-Rabin检测法
在Fermat测试中,需要计算 a n − 1 a^{n-1} a