RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的
算法原理
RSA公开密钥密码体制的原理是:根据数论,寻求两个大素数比较简单,而将它们的乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。
欧拉函数
欧拉函数 φ(n) 用于计算任意给定正整数n,在小于等于n的正整数之中,有多少个数与n构成互质关系。
比如,在1到8之中,有多少个数与8构成互质关系
-
如果n=1,则 φ(1) = 1 。因为1与任何数(包括自身)都构成互质关系
-
如果n是质数,则 φ(n)=n-1 。因为质数与小于它的每一个数,都构成互质关系。
如:5与1、2、3、4都构成互质关系。
-
如果n是质数的某一个次方,则 φ(pk)=pk - pk-1 = pk(1 - 1/p)。因为只有当一个数不包含质数p,才可能与n互质。而包含质数p的数一共有p(k-1)个,即1×p、2×p、3×p、…、p(k-1)×p,把它们去除,剩下的就是与n互质的数。
如 φ(8) = φ(23) =23- 22 = 8-4 = 4
-
如果n可以分解成两个互质的整数之积(n = p1 × p2),则φ(n) = φ(p1p2) = φ(p1)φ(p2)。即积的欧拉函数等于各个因子的欧拉函数之积。
如:φ(56)=φ(8×7)=φ(8)×φ(7)=4×6=24。
-
任意一个大于1的正整数,都可以写成一系列质数的积。
因为 n=pk11pk22 … pkrr
由第4条结论得: φ(n)=φ(pk11)φ(pk22)…φ(pkrr)
由第3条结论得:φ(n)=pk11pk22pk33 … pkrr(1- 1/p1)(1- 1/p2) … (1- 1/pr)
即:φ(n) = n(1- 1/p1) (1- 1/p2) … (1- 1/pr)
欧拉定理
如果两个正整数a和n互质,则n的欧拉函数 φ(n) 可以让下面的等式成立:
aφ(n) ≡ 1(mod n)
即:a的φ(n)次方被n除的余数为1
如:3和7互质,而7的欧拉函数φ(7)等于6,所以3的6次方(729)减去1,可以被7整除(728/7=104)。
3φ(7) ≡ 1 (mod 7)
欧拉定理有一个特殊情况,即费马小定理。
假设正整数a与质数p互质,因为质数p的φ§等于p-1,则欧拉定理可以写成:
ap-1 ≡ 1 (mod p)
模反元素
如果两个正整数a和n互质,那么一定可以找到整数b,使得 ab-1 被n整除,或者说ab被n除的余数是1。
ab ≡ 1 ( m o d n ) ,此时,b就是a的模反元素。
如:3和11互质,那么3的模反元素就是4,因为 (3 × 4)-1 可以被11整除。
欧拉定理可以用来证明模反元素必然存在。
aφ(n) = a*aφ(n-1) ≡ 1
可以看到,a的 φ(n)-1 次方,就是a的模反元素。
算法描述
- 任意选取两个不同的大素数p和q计算乘积
n = pq, φ(n) = (p-1)(q-1)
- 任意选取一个大整数e,满足
gcd (e, φ(n)) = 1
整数e用做加密钥(注意:e的选取是很容易的,例如,所有大于p和q的素数都可用)
- 确定的解密钥d,满足
(de) mod φ(n) = 1
即 de = kφ(n) + 1, K ≥ 1 是一个任意的整数;所以,若知道e和 ` φ(n),则很容易计算出d;
-
公开整数n和e,秘密保存d
-
将明文m(m<n是一个整数)加密成密文c,加密算法为
c = E(m) = m^e mod n
- 将密文c解密为明文m,解密算法为
m = D(c) = c^d mod n
- 签名,将明文m用私钥签名,签名算法为
sign = m^d mod n
- 验签,用公钥验证签名,验签算法为
m = sign^e mod n
然而只根据n和e(注意:不是p和q)要计算出d是不可能的。因此,任何人都可对明文进行加密,但只有授权用户(知道d)才可对密文解密
安全性
RSA的安全性依赖于大数分解,但是否等同于大数分解一直未能得到理论上的证明,也并没有从理论上证明破译。
RSA算法的保密强度随其密钥的长度增加而增强。
举例
-
为了方便我们准备两个很小对质数,
p = 3
q = 11
n = p * q = 3 * 11 = 33 -
求φ(n)
φ(n) = (p-1)(q-1) = 2 * 10 = 20
为方便书写,令L = φ(n) -
求e
1 < e < L 1 < e < 20
gcd (e, L) = 1, e 与 L 互质,选 e = 7
公钥 = (e, n) = (7, 33) -
求d
求d 也必须满足2个条件:1 < d < L,e*d mod L = 1
1 < d < 20
(7 * 3)mod 20 = 21 mod 20 = 1
d = 3 满足条件
私钥 = (d, n) = (3, 33) -
加密
明文m 小于n,假设m = 8
c = E(m) = m^e mod n = 8^7 mod 33 = 2097125 mod 33 = 2 -
解密
m = D© = c^d mod n = 2^3 mod 33 = 8 mod 33 = 8 -
签名
sign = md mod n
sign = 8^3 mod 33 = 512 mod 33 = 17 -
验签
m’ = signe mod n
m’ = 17^7 mod 33 = 410338673 mod 33 = 8
m’ = 8 = m, 验签成功