量子算法3 RSA & Shor Part I
终于来到了激动人心的Shor’s质数分解算法的环节,这可以说是有史以来最伟大的算法之一了。应该需要几次推送才能看完,其重大意义在于,假如量子计算机可用的情况下,其可以破解当前最流行的RSA加密算法。今天先看看相关数论基础,RSA简介,及Shor’s质数分解简介。
1 数论简单基础
1.1 质数分解
- 定理:每个正整数都有唯一的质数分解,
N
=
p
1
e
1
…
p
k
e
k
N=p_1^{e_1}\dots p_k^{e_k}
N=p1e1…pkek(Euclid, 300BC)
我们关注一个特殊情况,即 N = p q N=pq N=pq, 其中 p ≠ q p\ne q p=q是很大的质数,另外 n = ⌈ log 2 N ⌉ n=\lceil \log_2N \rceil n=⌈log2N⌉是表达 N N N所需的比特数,我们用 n n n来讨论复杂度。
注意,质数有无限多个,且在 N N N以内的质数数目大概是 N ln N \frac{N}{\ln N} lnNN个,虽然可以看出数越大出现质数的概率越低,因为其比线性慢点,但是也没慢多少,当数目较大时,大概可以认为1000个里面出一个质数。
如果采用遍历和试错方法,需要花费 ∼ N = ∼ 2 n / 2 \sim\sqrt{N}=\sim2^{n/2} ∼N=∼2n/2,即指数时间,取根号是因为,如果可以分解为两质数之积,那肯定有个是小于 N \sqrt{N} N的。
目前已知的最快的质数分解算法NFS(Number Field Sieve),使用high-powerd elliptic curve理论,也需要 ∼ exp ( n 1 / 3 ) \sim \exp(n^{1/3}) ∼exp(n1/3)时间,这个算法在NSA美国安全局肯定得到了使用。因此,目前,至少没有公开的多项式时间算法来做质数分解。
但是,通常认为质数分解问题不是NP完全问题,但是其困难性也是进行RSA公钥加密的基础。
1.2 Multiplicative group mod p
Multiplicative group mod p,记为
Z
p
×
=
{
i
∣
0
<
i
<
N
,
gcd
(
i
,
p
)
=
1
}
\mathbb{Z}^{\times}_p=\{i|0<i<N, \text{gcd}(i,p)=1\}
Zp×={i∣0<i<N,gcd(i,p)=1},即小于p,且跟p互质的数的集合;或者由
1
,
…
,
p
{1,\dots,p}
1,…,p在乘法
×
\times
×和取余mod p的操作下产生的集合,如下图
Z
5
×
\mathbb{Z}^{\times}_5
Z5×的每个元素,都是自己和自己相乘然后对5取余数,如
4
×
4
mod
5
=
1
4\times 4 \text{ mod } 5=1
4×4 mod 5=1。
定义
∣
Z
p
×
∣
=
ϕ
(
N
)
|\mathbb{Z}^{\times}_p|=\phi(N)
∣Zp×∣=ϕ(N)为"Euler totient function"即欧拉函数。
对于质数 p p p,其Multiplicative group mod p的元素个数 ϕ ( N ) = p − 1 \phi(N)=p-1 ϕ(N)=p−1,对于合数 N = p q N=pq N=pq, ϕ ( N ) = ( p − 1 ) ( q − 1 ) \phi(N)=(p-1)(q-1) ϕ(N)=(p−1)(q−1)。
1.3 费马小定理
对于任意质数 p p p,和整数 x x x,且 x x x不是 p p p的倍数,则 x p − 1 ≡ 1 (mod p) x^{p-1}\equiv 1 \text{ (mod p)} xp−1≡1 (mod p)费马小定理从Multiplicative group mod p的角度去理解,即认为对于 p − 1 p-1 p−1的集合,我从里面取任意一个数,将指数变成 p − 1 p-1 p−1,就变成了1,这个可以用该集合的相关理论去证明。
Euler’s Identity
这个相当于费马小定理的一个拓展,对于整数 N N N及和其互质的 x x x x ϕ ( N ) ≡ 1 mod N x^{\phi(N)}\equiv 1 \text{ mod N } xϕ(N)≡1 mod N
如果 N = p q N=pq N=pq,则 ϕ ( N ) = p q − p − q − 1 \phi(N)=pq-p-q-1 ϕ(N)=pq−p−q−1,则知道 ϕ ( N ) \phi(N) ϕ(N)就能有效率的分解 N N N,即 ϕ ( N ) \phi(N) ϕ(N)包括了对 N N N做质数分解的秘密。
1.4 一些经典数论算法
Primality,质数判断
- 虽然质数分解是指数复杂度很难,但是判断一个数是不是质数就没这么难了,可以在多项式时间内完成。但是其只能判断是否为质数,对于合数也不会给出其分解的信息。
- 在RSA的密钥生成时是需要这么判断的。
- 从1970s就有了多项式复杂度的随机算法,2002年AKS也提出了确定行的多项式复杂度的确定性算法(人家还是个本科生,想想觉得自己是废物)
- 大概思路是进行费马测试,选一个相对于 N N N互质的 x x x,看看 x N − 1 ≡ 1 mod p x^{N-1}\equiv1 \text{ mod p } xN−1≡1 mod p 是否成立,不成立就说不是质数;当然不成立不能作为充分条件,比如 561 = 3 × 11 × 17 561=3\times 11 \times 17 561=3×11×17就能通过这个测试,但是经过另外一些神奇的已经证明的操作,也是可以证明其可以发展成一个多项式算法来判断是否为质数。
Euclid’s GCD algorithm,最大公约数算法
最大公约数算法我们应该都了解过,就是 gcd(a,b)=gcd(a,b mod a) \text{gcd(a,b)=gcd(a,b mod a)} gcd(a,b)=gcd(a,b mod a),这样可以将数字指数性的减小,因此在 min { log a , log b } \min\{\log a,\log b\} min{loga,logb}迭代次数内就能完成,也是多项式时间。
Repeated squaring,高效指数运算
我们发现需要经常计算
x
y
mod N
x^y \text{mod N}
xymod N这种操作,如果
y
y
y是很大的数如
exp
(
n
)
\exp(n)
exp(n)就很难算了。更好的方法是,将
y
y
y分解为2的指数的和,这个就是计算机里面的表达方式,还是很好分解的,通过不断的平方操作来计算,如图所示:
可以看出,也是在指数的速度就把这个指数操作算完了,所以其复杂度也是对
log
N
=
n
\log N=n
logN=n呈多项式复杂度的。
2 RSA加密算法
- 基本场景:张三想给在淘宝上买东西,因此要把自己的账户密码啥的信息发给淘宝;
- 准备工作:假设淘宝用的是RSA加密算算法,那淘宝会先生成一些大的随机的质数,因为大质数大概1000个里头出一个,且判断是否质数也是多项式时间,所以这个过程可以有效率的完成。假设生成的质数 p ≡ 2 mod 3 p\equiv2 \text{ mod 3} p≡2 mod 3,即 p − 1 p-1 p−1, q − 1 q-1 q−1不是3的倍数,这些质数也很多,因为mod 3也就1和2两种情况。
- 淘宝发给张三一个数 N = p q N=pq N=pq,这个是公开发布的,黑客也可以监听到,这个数就叫做公钥。
- 张三用 N N N来加密自己的信息 x x x,当然会往 x x x里面放入一些随机的信息,以免有重复的序列被破解。加密后得到 y = x 3 mod N y=x^3 \text{ mod N} y=x3 mod N,然后发送 y y y到淘宝,黑客可以监听到 y y y,也知道 N N N,但是计算离散的立方根是个很难的问题,所以黑客无法有效率的破解到 x x x。当然3也可以换成别的,但是3是第一个发现可以的指数。
- 淘宝得到了
y
y
y,淘宝就可以很有效率的破解到
x
x
x,因为淘宝知道
N
=
p
q
N=pq
N=pq,那淘宝怎么破解呢?淘宝首先取
k
=
2
ϕ
(
N
)
+
1
3
k=\frac{2\phi(N)+1}{3}
k=32ϕ(N)+1,这是个整数,因为
ϕ
(
N
)
=
(
p
−
1
)
(
q
−
1
)
≡
2
mod 3
\phi(N)=(p-1)(q-1)\equiv2 \text{ mod 3}
ϕ(N)=(p−1)(q−1)≡2 mod 3;然后淘宝计算
y
k
mod
N
=
x
3
k
mod
N
=
x
2
ϕ
(
N
)
+
1
mod
N
=
x
y^k\text{ mod }N=x^{3k}\text{ mod }N=x^{2\phi(N)+1}\text{ mod }N=x
yk mod N=x3k mod N=x2ϕ(N)+1 mod N=x,这一步由前面的Euler’s identity公式可得
注意: - 破解RSA是否一定要分解质数,这还是个待解答的问题,但是能分解质数肯定就能破解是毋庸置疑的
3 Shor算法概要
3.1 History
Shor’s algorithm,这个其实和前面的Simon有点关系,这个故事和投稿被拒有关系(相信广大硕博士生们深有同感),Simon想了个新算法想投个会议,结果被拒了,因为人家觉得量子计算机还没谱你搞这些算法,用查询复杂度搞这些东西没啥用(这种否定最痛苦了!)。
但是,有个会议委员叫Peter Shor还挺喜欢这个文章的,于是Shor好心的建议Simon让他把论文改改,改成一个能解决Period finding(周期寻找)的算法;然后,Shor又发现,非常的“Obviously”,这个周期寻找算法可以解决质数分解问题,所以第二年Shor就发明了Shor算法,当然,Shor认为的显然,估计跟北大韦神认为的很简单差不多。。。
3.2 Procedures
- 第一步,把质数分解问题,转化为周期寻找问题,这一步Shor认为是显然的,当然我们不会这么认为。。。
- 第二步,通过量子傅里叶变换QFT,以 O ( 1 ) O(1) O(1)查询复杂度解决周期寻找问题
- 第三步,建立QFT的量子电路,用 n O ( 1 ) = log n O ( 1 ) n^{O(1)}=\log n^{O(1)} nO(1)=lognO(1)个量子门
- 第四步,把冰箱门关上,用Continued Fraction Algorithm把QFT的输出变成质数分解的结果,然后大象就装冰箱里了
3.3 Notes
- Shor算法并没有证明一定实现superpolynomial加速,因为质数分解的复杂度也没得到证明
- Shor算法可以证明实现了周期寻找的superpolynomial加速,而周期寻找问题相当于解决质数分解的一个黑箱,但不一定是唯一黑箱