8.2 RSA问题与加密
-
本节学习第一个也是目前应用最广泛的公钥加密方案RSA。
-
目录:RSA问题,针对“书本上RSA”加密的攻击,实践中的RSA加密。
-
RSA概览
- RSA: Ron Rivest, Adi Shamir and Leonard Adleman, 三位作者于1977年发表RSA加密方案。
- RSA问题: 给定 N=pqN = pqN=pq (两个不同的大质数的乘积) 并且 y∈ZN∗y \in \mathbb{Z}^*_Ny∈ZN∗,计算 y−ey^{-e}y−e,即yyy模NNN下的eee次方根。
- 开放问题:RSA问题比分解 NNN 更容易吗?
- RSA相关标准: PKCS#1 (RFC3447/8017), ANSI X9.31, IEEE 1363
- 密钥长度:1,024 到 4,096 比特
- 已知最强的公开密码学分析:768比特密钥已经被破解
- RSA挑战赛:破解 RSA-2048 来赢得 $200,000 USD
- 密钥长度比较 :3072比特RSA密钥安全强度相当于128比特对称密钥
-
书本上的RSA
- 构造:
- Gen\mathsf{Gen}Gen: 输入 1n1^n1n 运行 GenRSA(1n)\mathsf{GenRSA}(1^n)GenRSA(1n) 产生 N,e,dN,e,dN,e,d。 pk=⟨N,e⟩pk = \langle N,e \ranglepk=⟨N,e⟩ 和 sk=⟨N,d⟩sk = \langle N,d \ranglesk=⟨N,d⟩。
- Enc\mathsf{Enc}Enc: 输入 pkpkpk 和 m∈ZN∗m \in \mathbb{Z}^*_Nm∈ZN∗,获得密文 c:=[me mod N]c:= [m^e \bmod N]c:=[memodN].
- Dec\mathsf{Dec}Dec: 输入 sksksk 和 m∈ZN∗m \in \mathbb{Z}^*_Nm∈ZN∗,获得明文 m:=[cd mod N]m:= [c^d \bmod N]m:=[cdmodN].
- 不安全性:由于“书本上的RSA”是确定性的,在我们已经提出的任何安全定义下都是不安全的。
- 下面学习问题:如何产生 N,e,dN,e,dN,e,d? 什么是 ZN∗\mathbb{Z}^*_NZN∗? 如何计算 me mod Nm^e \bmod NmemodN? 这个难题是TDP? 为什么很难?
- 参考教材:《A Computational Introduction to Number Theory and Algebra》(Version 2) Victor Shoup。
- 构造:
-
质数与模算术
- 整数集合 Z\mathbb{Z}Z, a,b,c∈Za,b,c \in \mathbb{Z}a,b,c∈Z。
- aaa 整除 bbb: a∣ba \mid ba∣b 如果 ∃c,ac=b\exists c, ac=b∃c,ac=b (否则 a∤ba \nmid ba∤b). bbb 是 aaa 的倍数。如果 a∉{1,b}a \notin \{1,b\}a∈/{1,b},那么 aaa 是 bbb 的因子。
- p>1p > 1p>1 是质数(素数),如果其没有因子;否则,是合数。
- ∀a,b\forall a,b∀a,b, ∃\exists∃ 商 qqq, 余数 rrr: a=qb+ra=qb+ra=qb+r, 且 0≤r<b0\le r < b0≤r<b。
- 最大公因子 gcd(a,b)\gcd(a,b)gcd(a,b) 是最大的整数 ccc 使得 c∣ac\mid ac∣a 且 c∣bc\mid bc∣b。 gcd(0,b)=b\gcd(0,b)=bgcd(0,b)=b, gcd(0,0)\gcd(0,0)gcd(0,0)为定义。
- aaa 和 bbb 是互质,如果 gcd(a,b)=1\gcd(a,b)=1gcd(a,b)=1。
- 余数 r=[a mod N]=a−b⌊a/b⌋r= [a\bmod N] = a - b\lfloor a/b\rfloorr=[amodN]=a−b⌊a/b⌋ 并且 r<Nr<Nr<N. NNN 称为模。
- ZN={0,1,…,N−1}={a mod N∣a∈Z}\mathbb{Z}_N = \{0,1,\dots,N-1\} = \{a \bmod N | a \in \mathbb{Z}\}ZN={0,1,…,N−1}={amodN∣a∈Z}.
- aaa 是模 NNN 下可逆的 ⟺ gcd(a,N)=1\iff \gcd(a,N) = 1⟺gcd(a,N)=1。如果 ab≡1(modN)ab \equiv 1 \pmod Nab≡1(modN),那么 b=a−1b=a^{-1}b=a−1是模 NNN 下 aaa 的乘法逆。
-
模算术例子
- 欧几里德算法(辗转相除法): gcd(a,b)=gcd(b,[a mod b]).\gcd(a,b) = \gcd(b, [a \bmod b]).gcd(a,b)=gcd(b,[amodb]).
- gcd(12,27)\gcd(12, 27)gcd(12,27)
- 扩展欧几里德算法:给定 a,Na,Na,N,寻找 X,YX,YX,Y 使得 Xa+YN=gcd(a,N)Xa+YN = \gcd(a,N)Xa+YN=gcd(a,N) (贝祖定理)
- 求 11(mod17)11 \pmod {17}11(mod17) 的逆
- 求余然后相加/乘
- 计算 193028⋅190301 mod 100193028 \cdot 190301 \bmod 100193028⋅190301mod100
- 消去律:如果 gcd(a,N)=1\gcd(a,N)=1gcd(a,N)=1 且 ab≡ac(modN)ab \equiv ac \pmod Nab≡ac(modN),那么 b≡c(modN)b \equiv c \pmod Nb≡c(modN).
- a=3,c=10,b=2,N=24a=3, c=10, b=2, N=24a=3,c=10,b=2,N=24
- 欧几里德算法(辗转相除法): gcd(a,b)=gcd(b,[a mod b]).\gcd(a,b) = \gcd(b, [a \bmod b]).gcd(a,b)=gcd(b,[amodb]).
-
ZN∗\mathbb{Z}_N^*ZN∗ 群
- ZN∗=def{a∈{1,…,N−1}∣gcd(a,N)=1}\mathbb{Z}_N^* \overset{\text{def}}{=} \{a \in \{1,\dotsc,N-1 \} | \gcd(a,N) = 1\}ZN∗=def{a∈{1,…,N−1}∣gcd(a,N)=1}
- 群是一个集合 G\mathbb{G}G 带有一个二元操作 ∘\circ∘:
- 闭包: ∀g,h∈G\forall g,h \in \mathbb{G}∀g,h∈G, g∘h∈Gg \circ h \in \mathbb{G}g∘h∈G.
- 单位元: ∃\exists∃ 单位元 e∈Ge\in \mathbb{G}e∈G 使得 ∀g∈G,e∘g=g=g∘e\forall g\in \mathbb{G}, e \circ g = g = g \circ e∀g∈G,e∘g=g=g∘e.
- 逆元: ∀g∈G\forall g \in G∀g∈G, ∃ h∈G\exists\; h \in \mathbb{G}∃h∈G 使得 g∘h=e=h∘gg \circ h =e = h \circ gg∘h=e=h∘g. hhh 是 ggg 的逆元.
- 结合律:∀g1,g2,g3∈G\forall g_1,g_2,g_3 \in \mathbb{G}∀g1,g2,g3∈G, (g1∘g2)∘g3=g1∘(g2∘g3)(g_1\circ g_2)\circ g_3 = g_1 \circ (g_2 \circ g_3)(g1∘g2)∘g3=g1∘(g2∘g3).
- G\mathbb{G}G with ∘\circ∘ 是阿贝尔群,如果有交换律:∀g,h∈G,g∘h=h∘g\forall g,h \in \mathbb{G}, g\circ h = h\circ g∀g,h∈G,g∘h=h∘g.
- 逆元的存在意味着消去律
- 当 G\mathbb{G}G 是有限群,∣G∣| \mathbb{G}|∣G∣ 是群的阶。
- 问题: ZN∗\mathbb{Z}_N^*ZN∗ 是乘法下的群吗? ZN\mathbb{Z}_NZN 在乘法下呢? Z15∗=?\mathbb{Z}_{15}^* = ?Z15∗=? Z13∗=?\mathbb{Z}_{13}^* = ?Z13∗=?
-
群指数
- gm=defg∘g∘⋯∘g⏟m times.g^m \overset{\text{def}}{=} \underbrace{g\circ g\circ \cdots \circ g}_{m\; \text{times}}.gm=defmtimesg∘g∘⋯∘g.
- 欧拉定理:G\mathbb{G}G 是有限群。那么, ∀g∈G,g∣G∣=1\forall g \in \mathbb{G}, g^{|\mathbb{G}|}=1∀g∈G,g∣G∣=1.
- 注:课上证明,将群中每个元素与 ggg 相乘后连乘等于群中元素连乘。
- 例子:计算 3∈Z7∗3 \in \mathbb{Z}_{7}^*3∈Z7∗ 的所有指数。
- 费马小定理:∀g∈G\forall g \in \mathbb{G}∀g∈G and iii, gi≡g[i mod ∣G∣]g^i \equiv g^{[i \bmod {|\mathbb{G}|}]}gi≡g[imod∣G∣].
- 注:这是欧拉定理的推论。
- 例子:计算 378∈Z7∗3^{78} \in \mathbb{Z}_{7}^*378∈Z7∗
-
算术算法
- 加/减:线性时间 O(n)O(n)O(n).
- 乘:最初 O(n2)O(n^2)O(n2)。
- Karatsuba (1960,当时23岁): O(nlog23)O(n^{\log_2 3})O(nlog23) (2bx1+x0)×(2by1+y0)(2^bx_1+x_0) \times (2^by_1+ y_0)(2bx1+x0)×(2by1+y0) 使用3个乘法。
- 注:因为 x1⋅y0+x0⋅y1=(x1+x0)⋅(y1+y0)−x1⋅y1−x0⋅y0x_1 \cdot y_0 + x_0 \cdot y_1 = (x_1 + x_0) \cdot (y_1 + y_0) - x_1 \cdot y_1 - x_0 \cdot y_0x1⋅y0+x0⋅y1=(x1+x0)⋅(y1+y0)−x1⋅y1−x0⋅y0。
- 最佳渐进算法: O(nlogn)O(n\log n)O(nlogn)。
- 除/求余:O(n2)O(n^2)O(n2)。
- 指数:O(n3)O(n^3)O(n3),平方指数法,例如计算8次幂并不需要乘8次,而是计算4次幂的平方,而4次幂来自2次幂平方。
- 输入 g∈Gg \in Gg∈G; 指数 x=[xnxn−1…x2x1x0]2x=[x_nx_{n-1}\dots x_2x_1x_0]_2x=[xnxn−1…x2x1x0]2
- 输出:gxg^xgx
- y←g;z←1y \gets g; z \gets 1y←g;z←1
- For i=0i = 0i=0 to nnn
- If (xi==1x_i == 1xi==1){z←z×yz \gets z \times yz←z×y}
- y←y2y \gets y^2y←y2
- Return zzz
- 这里举个例子,例如算g9g^9g9
-
欧拉的Phi函数
- 欧拉phi函数:ϕ(N)=def∣ZN∗∣\phi(N) \overset{\text{def}}{=} |\mathbb{Z}_N^*|ϕ(N)=def∣ZN∗∣. 注:整数乘法群的阶
- 算法基本定理:N=∏ipieiN = \prod_ip_i^{e_i}N=∏ipiei , {pi}\{p_i\}{pi} 是不同的质数, ϕ(N)=∏ipiei−1(pi−1)\phi(N) = \prod_ip_i^{e_i-1}(p_i-1)ϕ(N)=∏ipiei−1(pi−1)。
- 例题:N=pqN=pqN=pq 其中 p,qp,qp,q 是不同质数。ϕ(N)=?\phi(N)=?ϕ(N)=? ϕ(12)=?\phi(12)=?ϕ(12)=? ϕ(30)=?\phi(30)=?ϕ(30)=?
- 欧拉定理与费马小定理:a∈ZN∗a \in \mathbb{Z}_N^*a∈ZN∗. aϕ(N)≡1(modN)a^{\phi (N)} \equiv 1 \pmod Naϕ(N)≡1(modN). 注:前面证明过
- 如果 ppp 是质数并且 a∈{1,…,p−1}a \in \{1,\dotsc,p-1\}a∈{1,…,p−1},那么 ap−1≡1(modp)a^{p-1} \equiv 1 \pmod pap−1≡1(modp). 注:因为质数ppp乘法群的阶为p−1p-1p−1
- 例题:343 mod 49=?3^{43} \bmod 49 = ?343mod49=?
-
基于群指数函数的排列
- 指数函数 fe :f_e\;:fe: ZN∗→ZN∗\mathbb{Z}^*_N \to \mathbb{Z}^*_NZN∗→ZN∗ by fe(x)=[xe mod N]f_e(x) =[x^e \bmod N]fe(x)=[xemodN].
- 对指数函数求逆:yyy 的 eee 次方根: xe≡yx^e \equiv yxe≡y, x≡y1/ex \equiv y^{1/e}x≡y1/e.
- 推论:如果 gcd(e,ϕ(N))=1\gcd(e,\phi(N))=1gcd(e,ϕ(N))=1,那么 fef_efe 是排列。
- 证明:令 d=[e−1 mod ϕ(N)]d = [e^{-1} \bmod \phi(N)]d=[e−1modϕ(N)],那么 fdf_dfd 是 fef_efe 的逆函数。y≡xe;fd(y)≡yd≡xed≡xy \equiv x^{e};\quad f_{d}(y) \equiv y^d \equiv x^{ed} \equiv xy≡xe;fd(y)≡yd≡xed≡x.
- 例题:在 Z10∗\mathbb{Z}^*_{10}Z10∗ 中, e=3, d=?, fe(3)=?, fd(fe(3))=?, 913=?e = 3,\ d = ?,\ f_{e}(3) = ?,\ f_{d}(f_{e}(3)) = ?,\ 9^{\frac{1}{3}} = ?e=3, d=?, fe(3)=?, fd(fe(3))=?, 931=?
- 问题:如果对于某些特别的NNN无法计算 ϕ(N)\phi(N)ϕ(N) ,那么会如何?如果不能分解 NNN 呢?
-
整数分解是难的
- 分解 N=pqN=pqN=pq. p,qp,qp,q 长度相同为 nnn.
- 尝试分解: O(N⋅polylog(N))\mathcal{O}(\sqrt{N}\cdot \mathsf{polylog}(N))O(N⋅polylog(N)).
- Pollard’s p−1p-1p−1 方法: 当 p−1p-1p−1 具有小质数因子时有效。
- Pollard’s rho 方法: O(N1/4⋅polylog(N))\mathcal{O}(N^{1/4}\cdot \mathsf{polylog}(N))O(N1/4⋅polylog(N)).
- 二次筛法 [Carl Pomerance]: 亚指数时间 O(exp(n⋅logn))\mathcal{O}(\exp(\sqrt{n\cdot \log n}))O(exp(n⋅logn)).
- 已知最优算法为通用数域筛法 [Pollard]:O(exp(n1/3⋅(logn)2/3))\mathcal{O}(\exp(n^{1/3}\cdot(\log n)^{2/3}))O(exp(n1/3⋅(logn)2/3)).
-
RSA问题是难的
-
思路:分解难 ⟹ \implies⟹ 对于 N=pqN=pqN=pq, 找到 p,qp,qp,q 难 ⟹ \implies⟹ 计算 ϕ(N)=(p−1)(q−1)\phi(N)=(p-1)(q-1)ϕ(N)=(p−1)(q−1) 难
⟹ \implies⟹ 无法模 ϕ(N)\phi(N)ϕ(N) 计算
⟹ \implies⟹ 计算 e−1 mod ϕ(N)e^{-1} \bmod \phi(N)e−1modϕ(N) 难
这里存在裂缝
⟹ \implies⟹ RSA 问题难:给定 y∈ZN∗y \in \mathbb{Z}^*_Ny∈ZN∗, 计算 y−ey^{-e}y−e modulo NNN.
-
开放问题:RSA 比分解容易?
-
-
产生随机质数
- 为了构造RSA问题,首先需要一个产生随机质数的方法:随机选择的一个数,测试其是否为质数。
- 该方法的有效性需要回答两个问题:(1) 随机选择的数是质数的概率多大?(2) 是否能够有效地测试其是否为质数?
- 对于问题1,∃\exists∃ 常数 ccc 使得, ∀n>1\forall n>1∀n>1, 一个随机选择的 nnn 比特数为质数的概率至少 c/nc/nc/n。
- 对于问题2,如果 NNN 是质数,那么Miller-Rabin质性测试始终输出质数。如果 NNN 是合数,那么算法输出质数的概率至多 2−t2^{-t}2−t。
-
产生RSA问题
- 令 GenModulus(1n)\mathsf{GenModulus}(1^n)GenModulus(1n) 为一个概率多项式时间算法,输入 1n1^n1n, 输出 (N,p,q)(N,p,q)(N,p,q) ,其中 N=pqN=pqN=pq, 并且 p,qp,qp,q 是 nnn 比特质数,除了有可忽略的概率失败。
- 产生RSA问题算法简述:
- 由GenModulus(1n)\mathsf{GenModulus}(1^n)GenModulus(1n) 产生 (N,p,q)(N,p,q)(N,p,q) ;
- 计算ϕ(N):=(p−1)(q−1)\phi(N) := (p-1)(q-1)ϕ(N):=(p−1)(q−1);
- 寻找一个eee,使得gcd(e,ϕ(N))=1\gcd(e,\phi(N))=1gcd(e,ϕ(N))=1;
- 计算d:=[e−1 mod ϕ(N)]d := [e^{-1} \bmod \phi(N)]d:=[e−1modϕ(N)];
- 返回 N,e,dN,e,dN,e,d
-
RSA假设
- RSA实验 RSAinvA,GenRSA(n)\mathsf{RSAinv}_{\mathcal{A},\mathsf{GenRSA}}(n)RSAinvA,GenRSA(n):
- 运行 GenRSA(1n)\mathsf{GenRSA}(1^n)GenRSA(1n) 来产生 (N,e,d)(N,e,d)(N,e,d)。
- 选择 y←ZN∗y \gets \mathbb{Z}^*_Ny←ZN∗。
- 敌手 A\mathcal{A}A 给定 N,e,yN,e,yN,e,y, 并输出 x∈ZN∗x \in \mathbb{Z}^*_Nx∈ZN∗.
- RSAinvA,GenRSA(n)=1\mathsf{RSAinv}_{\mathcal{A},\mathsf{GenRSA}}(n)=1RSAinvA,GenRSA(n)=1 ,实验成功,如果 xe≡y(modN)x^e \equiv y \pmod Nxe≡y(modN),否则实验失败 0 。
- 定义:RSA问题相对于GenRSA\mathsf{GenRSA}GenRSA是难的,如果 ∀\forall∀ PPT算法 A\mathcal{A}A, ∃\exists∃ negl\mathsf{negl}negl 使得,Pr[RSAinvA,GenRSA(n)=1]≤negl(n).\Pr[\mathsf{RSAinv}_{\mathcal{A},\mathsf{GenRSA}}(n) = 1] \le \mathsf{negl}(n).Pr[RSAinvA,GenRSA(n)=1]≤negl(n).
- RSA实验 RSAinvA,GenRSA(n)\mathsf{RSAinv}_{\mathcal{A},\mathsf{GenRSA}}(n)RSAinvA,GenRSA(n):
-
构造陷门排列
- 用 GenRSA\mathsf{GenRSA}GenRSA 来定义一个排列族:
- Gen\mathsf{Gen}Gen: 输入 1n1^n1n, 运行 GenRSA(1n)\mathsf{GenRSA}(1^n)GenRSA(1n) 来产生 (N,e,d)(N,e,d)(N,e,d) 并且 I=⟨N,e⟩,td=dI=\langle N,e \rangle, \mathsf{td}=dI=⟨N,e⟩,td=d, 令 DI=Dtd=ZN∗\mathcal{D}_I = \mathcal{D}_{\mathsf{td}} = \mathbb{Z}^*_NDI=Dtd=ZN∗.
- Samp\mathsf{Samp}Samp: 输入 III, 挑选一个随机元素 xxx of ZN∗\mathbb{Z}^*_NZN∗.
- fI(x)=[xe mod N]f_{I}(x) = [ x^e \bmod N]fI(x)=[xemodN].
- 确定性求逆算法 Invtd(y)=[yd mod N]\mathsf{Inv}_{\mathsf{td}}(y) = [ y^d \bmod N]Invtd(y)=[ydmodN].
- 将RSA问题规约到陷门排列求逆问题。
- 用 GenRSA\mathsf{GenRSA}GenRSA 来定义一个排列族:
-
回顾“书本上的RSA”
- 略
-
攻击带有小eee的“书本上的RSA”
- 小 eee 和 小 mmm 令模算术失去作用,不再是难题。
- 如果 e=3e=3e=3 并且 m<N1/3m < N^{1/3}m<N1/3,那么 c=m3c = m^3c=m3 并且 m=m=m= ?
- 在混合加密中,1024比特 RSA 与 128比特 AES。
- 当小eee 被使用时通用攻击:
- e=3e=3e=3, 同一个消息 mmm 被发送给 3 个不同的接收者。
- c1=[m3 mod N1]c_1= [ m^3 \bmod N_1]c1=[m3modN1], c2=[m3 mod N2]c_2= [ m^3 \bmod N_2]c2=[m3modN2], c3=[m3 mod N3]c_3= [ m^3 \bmod N_3]c3=[m3modN3].
- N1,N2,N3N_1,N_2,N_3N1,N2,N3 互质, 并且 N∗=N1N2N3N^*=N_1N_2N_3N∗=N1N2N3,使用中国剩余定理可知,∃\exists∃ 唯一的 c^<N∗\hat{c} < N^*c^<N∗:
- c^≡c1(modN1)\hat{c} \equiv c_1 \pmod{N_1}c^≡c1(modN1), c^≡c2(modN2)\hat{c} \equiv c_2 \pmod{N_2}c^≡c2(modN2), c^≡c3(modN3)\hat{c} \equiv c_3 \pmod{N_3}c^≡c3(modN3).
- c^≡m3(modN∗)\hat{c} \equiv m^3 \pmod{N^*}c^≡m3(modN∗). 由于 m3<N∗m^3 < N^*m3<N∗, m=c^1/3m = \hat{c}^{1/3}m=c^1/3.
- 小 eee 和 小 mmm 令模算术失去作用,不再是难题。
-
对恢复明文的二次改进
- 如果 1≤m<L=2ℓ1 \le m < \mathcal{L} = 2^{\ell}1≤m<L=2ℓ, 存在一个算法可以在 L\sqrt{\mathcal{L}}L 时间恢复 mmm 。
- 思路:c≡me=(r⋅s)e=re⋅se(modN)c \equiv m^e = (r\cdot s)^e = r^e\cdot s^e \pmod Nc≡me=(r⋅s)e=re⋅se(modN)
- 算法:
- 输入:公钥 ⟨N,e⟩\langle N,e \rangle⟨N,e⟩; 密文 ccc; 参数 ℓ\ellℓ
- 输出:m<2ℓm < 2^{\ell}m<2ℓ 使得 me≡c(modN)m^e \equiv c \pmod Nme≡c(modN)
- T:=2αℓT := 2^{\alpha \ell}T:=2αℓ //12<constant α<1\frac{1}{2} < \text{constant}\; \alpha <121<constantα<1
- For{r=1r=1r=1 to TTT} {xr:=[c/re mod N]x_r := [c/r^e \bmod N]xr:=[c/remodN]}
- sort pairs {(r,xr)}r=1T\{ (r,x_r)\}^T_{r=1}{(r,xr)}r=1T by xrx_rxr
- For s=1s=1s=1 to TTT
- If [se mod N]=?xr[s^e \bmod N] \overset{?}{=} x_r[semodN]=?xr for some rrr
- Return [r⋅s mod N][r\cdot s \bmod N][r⋅smodN]
- If [se mod N]=?xr[s^e \bmod N] \overset{?}{=} x_r[semodN]=?xr for some rrr
- Return fail
-
共模攻击
- 共模攻击使用相同的模数 NNN.
- 情况1:多个用户带有自己的密钥。每个用户可以以自己的 e,de,de,d 计算 ϕ(N)\phi(N)ϕ(N) ,然后找到其他人的 ddd.
- 情况2:用两个公钥为同一个消息加密。
- 假设 gcd(e1,e2)=1\gcd(e_1,e_2)=1gcd(e1,e2)=1, c1≡me1c_1 \equiv m^{e_1}c1≡me1 and c2≡me2(modN)c_2 \equiv m^{e_2} \pmod Nc2≡me2(modN). ∃X,Y\exists X,Y∃X,Y 使得 Xe1+Ye2=1Xe_1 + Ye_2 = 1Xe1+Ye2=1 (贝祖定理).
- c1X⋅c2Y≡mXe1mYe2≡m1(modN).c_1^X\cdot c_2^Y \equiv m^{Xe_1}m^{Ye_2} \equiv m^1 \pmod N.c1X⋅c2Y≡mXe1mYe2≡m1(modN).
- N=15,e1=3,e2=5,c1=8,c2=2,m=?N = 15, e_{1} = 3, e_{2} = 5, c_{1} = 8, c_{2} = 2, m = ?N=15,e1=3,e2=5,c1=8,c2=2,m=?
-
对“书本上RSA”的CCA
- 使用CCA恢复消息:敌手 A\mathcal{A}A 选择一个随机数 r←ZN∗r \gets \mathbb{Z}^*_Nr←ZN∗ 并计算 c′=[re⋅c mod N]c' = [r^e\cdot c \bmod N]c′=[re⋅cmodN],使用CCA获得 m′m'm′ 。那么,m=?m= ?m=?
- 在拍卖中讲价格翻倍:c=[me mod N]c = [m^e \bmod N]c=[memodN]. c′=[2ec mod N]c'= [2^ec \bmod N]c′=[2ecmodN].
-
RSA实现问题
- 将二进制串编码为 ZN∗\mathbb{Z}^*_NZN∗ 中元素: ℓ=∥N∥\ell = \|N\|ℓ=∥N∥。任意长度为ℓ−1\ell - 1ℓ−1 的二进制串 mmm 可以被看作是 ZNZ_NZN 中元素。尽管 mmm 不在 ZN∗Z_N^*ZN∗ 中,RSA 仍工作。
- eee 的选择:e=3e=3e=3 或小 ddd 都是坏选择。 推荐 e=65537=216+1e=65537=2^{16}+1e=65537=216+1
- 使用中国剩余定理来加速解密:[cd mod N]↔([cd mod p],[cd mod q]).[c^d \bmod N] \leftrightarrow ([c^d \bmod p],[c^d \bmod q]).[cdmodN]↔([cdmodp],[cdmodq]).
- 假设一个 nnn 比特整数指数预算需要 n3n^3n3 操作。RSA 解密花费 (2n)3=8n3(2n)^3=8n^3(2n)3=8n3,其中使用中国剩余定理需要 2n32n^32n3。
-
Padded RSA
- 思路:添加随机性来改进安全
- 构造:
- 令 ℓ\ellℓ 为一个函数,对所有 nnn, ℓ(n)≤2n−2\ell(n) \le 2n-2ℓ(n)≤2n−2,为被加密的消息长度。
- Gen\mathsf{Gen}Gen: 输入 1n1^n1n, 运行 GenRSA(1n)\mathsf{GenRSA}(1^n)GenRSA(1n) 来产生 (N,e,d)(N,e,d)(N,e,d). 输出 pk=⟨N,e⟩pk = \langle N,e \ranglepk=⟨N,e⟩ 和 sk=⟨N,d⟩sk = \langle N,d \ranglesk=⟨N,d⟩。
- Enc\mathsf{Enc}Enc: 输入 m∈{0,1}ℓ(n)m \in \{0,1\}^{\ell(n)}m∈{0,1}ℓ(n), 选择随机串 r←{0,1}∥N∥−ℓ(n)−1r \gets \{0,1\}^{\|N\| - \ell(n)-1}r←{0,1}∥N∥−ℓ(n)−1. 输出 c:=[(r∥m)e mod N]c:=[(r\|m)^e \bmod N]c:=[(r∥m)emodN]。注:填充随机串后加密
- Dec\mathsf{Dec}Dec: 计算 m^:=[cd mod N]\hat{m} := [c^d \bmod N]m^:=[cdmodN], 并输出 m^\hat{m}m^ 中的低ℓ(n)\ell(n)ℓ(n)个比特。注:这部分为明文
- ℓ\ellℓ 不应该太大 (理论上的 rrr 太小) 也不应该太小 (实践中的 mmm 太小)。
- 定理:如果RSA问题相对于GenRSA\mathsf{GenRSA}GenRSA 是难的,那么基于 ℓ(n)=O(logn)\ell(n)=\mathcal{O}(\log n)ℓ(n)=O(logn) 的构造是CPA安全的。
- 证明:与对称加密中CPA安全方案类似。
-
对RSA的实现攻击
- 对HTTPS中PKCS1 v1.5的简化的CCA攻击 [Bleichenbacher]
- 服务器对给定的密文来应答明文的最高有效位是否等于1 (版本号) 。攻击者发送 c′=(2r)e⋅cc' = (2^{r})^{e}\cdot cc′=(2r)e⋅c。如果收到 YesYesYes,那么明文中第(r+1)(r+1)(r+1)最高有效位= ?
- 防御:处理格式不正确的消息和格式正确的消息的方式应该是不可区分的。[RFC 5246]
-
PKCS #1 v2.1 (RSAES-OAEP)
- 最优非对称加密填充(Optimal Asymmetric Encryption Padding,OAEP): 将长度 n/2n/2n/2 的 mmm 编码为长度 2n2n2n 的消息 m^\hat{m}m^ 。 G,HG, HG,H 是随机预言机。
- RSA-OAEP在ROM下是CCA安全的。(当RO实例化后可能不安全)
- CPA攻击下,敌手不知道rrr,则mmm被完美保护;若要知道 rrr,则必须知道sss,这不可能。
- CCA攻击下,无法有效进行解密查询,因为在应答前会检查明文中“00…0”。
- 局限性:这个方案对RSA是安全的,但对其他TDP可能不是。
-
OAEP改进
- OAEP+对所有TDP都是CCA安全的
- SAEP+更简单填充,同样安全
-
对RSA的实现攻击(续)
- 计时攻击:[Kocher et al. 1997] 计算 cdc^dcd 所消耗的时间可能泄漏 ddd。 (需要高解析时钟)
- 能耗攻击:[Kocher et al. 1999] 为计算cdc^dcd 智能卡消耗的能量可能泄漏ddd。
- 防御:将密文和随机数 rrr 绑定,解密 re⋅cr^{e}\cdot cre⋅c。
- 密钥生成问题:(在 OpenSSL RSA 密钥生成过程中):
- 相同的 ppp 由多个设备产生 (源自启动时的低熵),但是不同的 qqq (源自额外的随机性).
- 问题: 不同设备的 N1,N2N_1,N_2N1,N2 , gcd(N1,N2)=?\gcd(N_1,N_2) = ?gcd(N1,N2)=?
- 实验结果: 可分解 0.4% 的公开的HTTPS密钥。
-
对RSA的故障攻击
-
故障攻击:在解密过程中 cd mod Nc^d\bmod NcdmodN 发生的计算机故障可能泄漏 ddd 。
-
之前提到过使用中国剩余定理来加速解密:
[cd mod N]↔([mp≡cd(modp)],[mq≡cd(modq)])[c^d \bmod N] \leftrightarrow ([m_p \equiv c^d \pmod p],[m_q \equiv c^d \pmod q])[cdmodN]↔([mp≡cd(modp)],[mq≡cd(modq)])
-
假设在计算 mqm_qmq 时发生错误,但在计算 mpm_pmp 时没有错误。
-
m′≡cd(modp)m' \equiv c^d \pmod pm′≡cd(modp), m′≢cd(modq)m' \not \equiv c^d \pmod qm′≡cd(modq)。
-
(m′)e≡c(modp)(m')^e \equiv c \pmod p(m′)e≡c(modp), (m′)e≢c(modq)(m')^e \not \equiv c \pmod q(m′)e≡c(modq)
-
gcd((m′)e−c,N)= ?\gcd((m')^e-c, N)=\ ?gcd((m′)e−c,N)= ?
-
防御:检查输出 (但减慢 10% )。
-
-
总结
- RSA问题是TPD,但书本上RSA加密不安全,RSA-OAEP在ROM下是CCA安全的。