RSA算法涉及到生成参数Gen,加密Enc、解密Dec三个函数.
生成参数
生成参数输入指令并且输出两个足够大的素数p和q,不妨令N=pq.
实际过程中输出素数是通过构造大整数然后利用已知素性测试实验比如Miller rabin或者AKS(通常前者)判断是否素数,不是就重新构造大整数,这是很简单的.
- 求欧拉函数
计算
ϕ
(
N
)
=
(
p
−
1
)
(
q
−
1
)
\phi(N)=(p-1)(q-1)
ϕ(N)=(p−1)(q−1)也就是N的欧拉函数,必须强调由于已知N的质数分解这个计算十分容易,同时如果不知道N的质因数,或者说不能分解N,计算
ϕ
(
N
)
\phi(N)
ϕ(N)是不可行的.
找出一个e,利用扩展欧几里得乘法extended Euclidean algorithm保证e与
ϕ
(
N
)
\phi(N)
ϕ(N)互素,
#
e
=
ϕ
(
ϕ
(
N
)
)
\#e=\phi(\phi(N))
#e=ϕ(ϕ(N))确保了有足够多个e.
需要强调的是,实际过程中e往往取e为3(需要填充系统的帮助)或者已知最大费马素数
2
2
4
+
1
=
65537
2^{2^4}+1=65537
224+1=65537,最新的协议都要求e取65537(快速平方法只需要4次乘法一次加法),各位可以自行搜寻相关安全性分析(https://crypto.stackexchange.com/questions/3110/impacts-of-not-using-rsa-exponent-of-65537),e取这两者的安全性有一定的差别.
- 求逆
利用扩展欧几里得乘法extended Euclidean algorithm计算e模的逆,不妨将之记为d,也即是说e和d满足
e
d
=
1
ed=1
ed=1 mod
ϕ
(
N
)
\phi(N)
ϕ(N).
我们将N 和e作为公钥对,将d设为私钥,整个RSA的安全性可以说基于第三者对d的不了解,或者说第三者不能高效进行大数分解.
素数定理
对于足够大的x,我们有:
0.921
≤
π
(
x
)
x
/
I
n
x
≤
1.106
0.921\leq\frac{\pi(x)}{x/Inx}\leq 1.106
0.921≤x/Inxπ(x)≤1.106
素数定理用来估计素数个数,具体来说当我们考虑找一个1024bit也就是300位左右的素数时,我们自然想知道这样的素数大约有多少个:
#
o
f
1024
b
i
t
p
r
i
m
e
s
=
π
(
2
1024
)
−
π
(
2
1023
)
≈
2
1024
i
n
2
1024
−
2
1023
i
n
2
1023
≈
2
1013.53
\#\ of\ 1024 \ bit \ primes=\pi(2^{1024})-\pi(2^{1023})\approx \frac{2^{1024}}{in 2^{1024}}-\frac{2^{1023}}{in 2^{1023}}\approx 2^{1013.53}
# of 1024 bit primes=π(21024)−π(21023)≈in2102421024−in2102321023≈21013.53
也即是说我们随机选取的一个1024位数有大约0.04%的概率直接是素数.这其实是我们生成大素数的一个很重要的理论依据:如果素数足够少,那生成素数就会非常困难.
我们考虑Alice和Bob在一个不安全信道上进行通信,Eve是一个恶意的第三者,Eve可能监听信息,甚至可能篡改信息,制造伪公钥(active attack)等.
加密过程
Bob选择明文,将明文m表示成适当的进制(比如ASCII码).
- 加密
c
=
m
e
m
o
d
N
c=m^e\ mod\ \ N
c=me mod N
其中c为密文.
事实上计算密文所需大数求模也有诸如Barrett的化简算法,或者快速平方法.
解密过程
Alice 通过不安全信道接收到密文c,进行如下运算:
- 解密
m = c d m o d N m=c^d\ mod\ N m=cd mod N
其中c为密文,d为私钥,也就是e的模 ϕ ( N ) \phi(N) ϕ(N)逆元.该计算仍可运用诸如Barrett或者快速平方法的化简算法,.
安全性分析
考虑到密码学的任务就是“在非安全的信道上安全的通信”,那么一个恶意的第三者Eve就不可避免的出现.
我们进行最简单的分析,假设Eve只能窃取到密文,也就是
c
=
m
e
m
o
d
N
c=m^e\ mod\ \ N
c=me mod N,此外加上Eve 也可以得到的公钥信息,也就是N和e,Eve要解决的问题就是已知
N
,
e
,
m
e
m
o
d
N
N,e,m^e\ mod\ \ N
N,e,me mod N,如何计算m.
这个问题可以归约到大数分解问题,这里仅给出一个例子:
我们计算x满足
x
9
=
15
m
o
d
  
3
×
7
x^9=15 \mod 3\times7
x9=15mod3×7
计算过程如下:
{
x
9
=
15
m
o
d
  
3
⇔
x
=
15
m
o
d
  
3
⇔
x
=
0
m
o
d
  
3
x
9
=
15
m
o
d
  
7
⇔
x
3
=
1
m
o
d
  
7
⇔
x
15
=
1
5
m
o
d
  
7
⇔
x
=
1
m
o
d
  
7
\left\{ \begin{aligned} &x^9=15 \mod 3\Leftrightarrow x=15\mod3\Leftrightarrow x=0\mod 3 \\ &x^9=15 \mod 7\Leftrightarrow x^3=1\mod7\Leftrightarrow x^{15}=1^5\mod 7\Leftrightarrow x=1\mod 7 \end{aligned} \right.
{x9=15mod3⇔x=15mod3⇔x=0mod3x9=15mod7⇔x3=1mod7⇔x15=15mod7⇔x=1mod7
可以看出当我们知道模N的质数分解后,这就是一个简单的中国剩余定理问题,3和7互素必有解,解为
x
=
15
+
21
k
x=15+21k
x=15+21k
一点小问题
为什么p,q要足够大?
为什么N是两个素数的乘积而不是一个或者三个或者更多?
Eve还可以进行说明操作来影响Alice和Bob之间的通信?
扩展
事实上更多的内容值得我们去深究,比如素数的选取除了大还需要满足什么才能抵抗足够多的攻击?(比如要求 p − 1 2 \frac{p-1}2 2p−1仍是素数)又或者RSA还有那些其他性质?(比如乘法同态)RSA安全性是否足够可靠?(能否抵挡CCA,CPA等攻击)这点都需要讨论.