密码学-08(2)RSA问题与加密

8.2 RSA问题与加密

  1. 本节学习第一个也是目前应用最广泛的公钥加密方案RSA。

  2. 目录:RSA问题,针对“书本上RSA”加密的攻击,实践中的RSA加密。

  3. RSA概览

    • RSA: Ron Rivest, Adi Shamir and Leonard Adleman, 三位作者于1977年发表RSA加密方案。
    • RSA问题: 给定 N=pqN = pqN=pq (两个不同的大质数的乘积) 并且 y∈ZN∗y \in \mathbb{Z}^*_NyZN,计算 y−ey^{-e}ye,即yyyNNN下的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比特对称密钥
  4. 书本上的RSA

    • 构造:
      • Gen\mathsf{Gen}Gen: 输入 1n1^n1n 运行 GenRSA(1n)\mathsf{GenRSA}(1^n)GenRSA(1n) 产生 N,e,dN,e,dN,e,dpk=⟨N,e⟩pk = \langle N,e \ranglepk=N,esk=⟨N,d⟩sk = \langle N,d \ranglesk=N,d
      • Enc\mathsf{Enc}Enc: 输入 pkpkpkm∈ZN∗m \in \mathbb{Z}^*_NmZN,获得密文 c:=[me mod N]c:= [m^e \bmod N]c:=[memodN].
      • Dec\mathsf{Dec}Dec: 输入 skskskm∈ZN∗m \in \mathbb{Z}^*_NmZN,获得明文 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。
  5. 质数与模算术

    • 整数集合 Z\mathbb{Z}Z, a,b,c∈Za,b,c \in \mathbb{Z}a,b,cZ
    • aaa 整除 bbb: a∣ba \mid bab 如果 ∃c,ac=b\exists c, ac=bc,ac=b (否则 a∤ba \nmid bab). bbbaaa 的倍数。如果 a∉{1,b}a \notin \{1,b\}a/{1,b},那么 aaabbb 的因子。
    • p>1p > 1p>1 是质数(素数),如果其没有因子;否则,是合数。
    • ∀a,b\forall a,ba,b, ∃\existsqqq, 余数 rrr: a=qb+ra=qb+ra=qb+r, 且 0≤r<b0\le r < b0r<b
    • 最大公因子 gcd⁡(a,b)\gcd(a,b)gcd(a,b) 是最大的整数 ccc 使得 c∣ac\mid acac∣bc\mid bcbgcd⁡(0,b)=b\gcd(0,b)=bgcd(0,b)=b, gcd⁡(0,0)\gcd(0,0)gcd(0,0)为定义。
    • aaabbb 是互质,如果 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]=aba/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,,N1}={amodNaZ}.
    • aaa 是模 NNN 下可逆的  ⟺  gcd⁡(a,N)=1\iff \gcd(a,N) = 1gcd(a,N)=1。如果 ab≡1(modN)ab \equiv 1 \pmod Nab1(modN),那么 b=a−1b=a^{-1}b=a1是模 NNNaaa 的乘法逆。
  6. 模算术例子

    • 欧几里德算法(辗转相除法): 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 100193028190301mod100
    • 消去律:如果 gcd⁡(a,N)=1\gcd(a,N)=1gcd(a,N)=1ab≡ac(modN)ab \equiv ac \pmod Nabac(modN),那么 b≡c(modN)b \equiv c \pmod Nbc(modN).
      • a=3,c=10,b=2,N=24a=3, c=10, b=2, N=24a=3,c=10,b=2,N=24
  7. 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,,N1}gcd(a,N)=1}
    • 群是一个集合 G\mathbb{G}G 带有一个二元操作 ∘\circ:
      • 闭包: ∀g,h∈G\forall g,h \in \mathbb{G}g,hG, g∘h∈Gg \circ h \in \mathbb{G}ghG.
      • 单位元: ∃\exists 单位元 e∈Ge\in \mathbb{G}eG 使得 ∀g∈G,e∘g=g=g∘e\forall g\in \mathbb{G}, e \circ g = g = g \circ egG,eg=g=ge.
      • 逆元: ∀g∈G\forall g \in GgG, ∃  h∈G\exists\; h \in \mathbb{G}hG 使得 g∘h=e=h∘gg \circ h =e = h \circ ggh=e=hg. hhhggg 的逆元.
      • 结合律:∀g1,g2,g3∈G\forall g_1,g_2,g_3 \in \mathbb{G}g1,g2,g3G, (g1∘g2)∘g3=g1∘(g2∘g3)(g_1\circ g_2)\circ g_3 = g_1 \circ (g_2 \circ g_3)(g1g2)g3=g1(g2g3).
    • G\mathbb{G}G with ∘\circ 是阿贝尔群,如果有交换律:∀g,h∈G,g∘h=h∘g\forall g,h \in \mathbb{G}, g\circ h = h\circ gg,hG,gh=hg.
    • 逆元的存在意味着消去律
    • 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=?
  8. 群指数

    • gm=defg∘g∘⋯∘g⏟m  times.g^m \overset{\text{def}}{=} \underbrace{g\circ g\circ \cdots \circ g}_{m\; \text{times}}.gm=defmtimesggg.
    • 欧拉定理:G\mathbb{G}G 是有限群。那么, ∀g∈G,g∣G∣=1\forall g \in \mathbb{G}, g^{|\mathbb{G}|}=1gG,gG=1.
    • 注:课上证明,将群中每个元素与 ggg 相乘后连乘等于群中元素连乘。
    • 例子:计算 3∈Z7∗3 \in \mathbb{Z}_{7}^*3Z7 的所有指数。
    • 费马小定理:∀g∈G\forall g \in \mathbb{G}gG and iii, gi≡g[i mod ∣G∣]g^i \equiv g^{[i \bmod {|\mathbb{G}|}]}gig[imodG].
    • 注:这是欧拉定理的推论。
    • 例子:计算 378∈Z7∗3^{78} \in \mathbb{Z}_{7}^*378Z7
  9. 算术算法

    • 加/减:线性时间 O(n)O(n)O(n).
    • 乘:最初 O(n2)O(n^2)O(n2)
      • Karatsuba (1960,当时23岁): O(nlog⁡23)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_0x1y0+x0y1=(x1+x0)(y1+y0)x1y1x0y0
      • 最佳渐进算法: O(nlog⁡n)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 GgG; 指数 x=[xnxn−1…x2x1x0]2x=[x_nx_{n-1}\dots x_2x_1x_0]_2x=[xnxn1x2x1x0]2
      • 输出:gxg^xgx
      • y←g;z←1y \gets g; z \gets 1yg;z1
      • For i=0i = 0i=0 to nnn
        • If (xi==1x_i == 1xi==1){z←z×yz \gets z \times yzz×y}
        • y←y2y \gets y^2yy2
      • Return zzz
      • 这里举个例子,例如算g9g^9g9
  10. 欧拉的Phi函数

    • 欧拉phi函数:ϕ(N)=def∣ZN∗∣\phi(N) \overset{\text{def}}{=} |\mathbb{Z}_N^*|ϕ(N)=defZN. 注:整数乘法群的阶
    • 算法基本定理: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)=ipiei1(pi1)
    • 例题: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^*aZN. 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,,p1},那么 ap−1≡1(modp)a^{p-1} \equiv 1 \pmod pap11(modp). 注:因为质数ppp乘法群的阶为p−1p-1p1
    • 例题:343 mod 49=?3^{43} \bmod 49 = ?343mod49=?
  11. 基于群指数函数的排列

    • 指数函数 fe  :f_e\;:fe: ZN∗→ZN∗\mathbb{Z}^*_N \to \mathbb{Z}^*_NZNZN by fe(x)=[xe mod N]f_e(x) =[x^e \bmod N]fe(x)=[xemodN].
    • 对指数函数求逆:yyyeee 次方根: xe≡yx^e \equiv yxey, x≡y1/ex \equiv y^{1/e}xy1/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=[e1modϕ(N)],那么 fdf_dfdfef_efe 的逆函数。y≡xe;fd(y)≡yd≡xed≡xy \equiv x^{e};\quad f_{d}(y) \equiv y^d \equiv x^{ed} \equiv xyxe;fd(y)ydxedx.
    • 例题:在 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 呢?
  12. 整数分解是难的

    • 分解 N=pqN=pqN=pq. p,qp,qp,q 长度相同为 nnn.
    • 尝试分解: O(N⋅polylog(N))\mathcal{O}(\sqrt{N}\cdot \mathsf{polylog}(N))O(Npolylog(N)).
    • Pollard’s p−1p-1p1 方法: 当 p−1p-1p1 具有小质数因子时有效。
    • Pollard’s rho 方法: O(N1/4⋅polylog(N))\mathcal{O}(N^{1/4}\cdot \mathsf{polylog}(N))O(N1/4polylog(N)).
    • 二次筛法 [Carl Pomerance]: 亚指数时间 O(exp⁡(n⋅log⁡n))\mathcal{O}(\exp(\sqrt{n\cdot \log n}))O(exp(nlogn)).
    • 已知最优算法为通用数域筛法 [Pollard]:O(exp⁡(n1/3⋅(log⁡n)2/3))\mathcal{O}(\exp(n^{1/3}\cdot(\log n)^{2/3}))O(exp(n1/3(logn)2/3)).
  13. RSA问题是难的

    • 思路:分解难   ⟹  \implies 对于 N=pqN=pqN=pq, 找到 p,qp,qp,q  ⟹  \implies 计算 ϕ(N)=(p−1)(q−1)\phi(N)=(p-1)(q-1)ϕ(N)=(p1)(q1)

        ⟹  \implies 无法模 ϕ(N)\phi(N)ϕ(N) 计算

        ⟹  \implies 计算 e−1 mod ϕ(N)e^{-1} \bmod \phi(N)e1modϕ(N)

      这里存在裂缝

        ⟹  \implies RSA 问题难:给定 y∈ZN∗y \in \mathbb{Z}^*_NyZN, 计算 y−ey^{-e}ye modulo NNN.

    • 开放问题:RSA 比分解容易?

  14. 产生随机质数

    • 为了构造RSA问题,首先需要一个产生随机质数的方法:随机选择的一个数,测试其是否为质数。
    • 该方法的有效性需要回答两个问题:(1) 随机选择的数是质数的概率多大?(2) 是否能够有效地测试其是否为质数?
    • 对于问题1,∃\exists 常数 ccc 使得, ∀n>1\forall n>1n>1, 一个随机选择的 nnn 比特数为质数的概率至少 c/nc/nc/n
    • 对于问题2,如果 NNN 是质数,那么Miller-Rabin质性测试始终输出质数。如果 NNN 是合数,那么算法输出质数的概率至多 2−t2^{-t}2t
  15. 产生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,qnnn 比特质数,除了有可忽略的概率失败。
    • 产生RSA问题算法简述:
      1. GenModulus(1n)\mathsf{GenModulus}(1^n)GenModulus(1n) 产生 (N,p,q)(N,p,q)(N,p,q)
      2. 计算ϕ(N):=(p−1)(q−1)\phi(N) := (p-1)(q-1)ϕ(N):=(p1)(q1)
      3. 寻找一个eee,使得gcd⁡(e,ϕ(N))=1\gcd(e,\phi(N))=1gcd(e,ϕ(N))=1
      4. 计算d:=[e−1 mod ϕ(N)]d := [e^{-1} \bmod \phi(N)]d:=[e1modϕ(N)]
      5. 返回 N,e,dN,e,dN,e,d
  16. RSA假设

    • RSA实验 RSAinvA,GenRSA(n)\mathsf{RSAinv}_{\mathcal{A},\mathsf{GenRSA}}(n)RSAinvA,GenRSA(n):
      1. 运行 GenRSA(1n)\mathsf{GenRSA}(1^n)GenRSA(1n) 来产生 (N,e,d)(N,e,d)(N,e,d)
      2. 选择 y←ZN∗y \gets \mathbb{Z}^*_NyZN
      3. 敌手 A\mathcal{A}A 给定 N,e,yN,e,yN,e,y, 并输出 x∈ZN∗x \in \mathbb{Z}^*_NxZN.
      4. RSAinvA,GenRSA(n)=1\mathsf{RSAinv}_{\mathcal{A},\mathsf{GenRSA}}(n)=1RSAinvA,GenRSA(n)=1 ,实验成功,如果 xe≡y(modN)x^e \equiv y \pmod Nxey(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).
  17. 构造陷门排列

    • 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问题规约到陷门排列求逆问题。
  18. 回顾“书本上的RSA”

  19. 攻击带有小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.
  20. 对恢复明文的二次改进

    • 如果 1≤m<L=2ℓ1 \le m < \mathcal{L} = 2^{\ell}1m<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 Ncme=(rs)e=rese(modN)
    • 算法:
      • 输入:公钥 ⟨N,e⟩\langle N,e \rangleN,e; 密文 ccc; 参数 ℓ\ell
      • 输出:m<2ℓm < 2^{\ell}m<2 使得 me≡c(modN)m^e \equiv c \pmod Nmec(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][rsmodN]
      • Return fail
  21. 共模攻击

    • 共模攻击使用相同的模数 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}c1me1 and c2≡me2(modN)c_2 \equiv m^{e_2} \pmod Nc2me2(modN). ∃X,Y\exists X,YX,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.c1Xc2YmXe1mYe2m1(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=?
  22. 对“书本上RSA”的CCA

    • 使用CCA恢复消息:敌手 A\mathcal{A}A 选择一个随机数 r←ZN∗r \gets \mathbb{Z}^*_NrZN 并计算 c′=[re⋅c mod N]c' = [r^e\cdot c \bmod N]c=[recmodN],使用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].
  23. RSA实现问题

    • 将二进制串编码为 ZN∗\mathbb{Z}^*_NZN 中元素: ℓ=∥N∥\ell = \|N\|=N。任意长度为ℓ−1\ell - 11 的二进制串 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
  24. Padded RSA

    • 思路:添加随机性来改进安全
    • 构造:
      • ℓ\ell 为一个函数,对所有 nnnℓ(n)≤2n−2\ell(n) \le 2n-2(n)2n2,为被加密的消息长度。
      • 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,esk=⟨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:=[(rm)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(log⁡n)\ell(n)=\mathcal{O}(\log n)(n)=O(logn) 的构造是CPA安全的。
    • 证明:与对称加密中CPA安全方案类似。
  25. 对RSA的实现攻击

    • 对HTTPS中PKCS1 v1.5的简化的CCA攻击 [Bleichenbacher]
    • 服务器对给定的密文来应答明文的最高有效位是否等于1 (版本号) 。攻击者发送 c′=(2r)e⋅cc' = (2^{r})^{e}\cdot cc=(2r)ec。如果收到 YesYesYes,那么明文中第(r+1)(r+1)(r+1)最高有效位= ?
    • 防御:处理格式不正确的消息和格式正确的消息的方式应该是不可区分的。[RFC 5246]
  26. PKCS #1 v2.1 (RSAES-OAEP)

    • 最优非对称加密填充(Optimal Asymmetric Encryption Padding,OAEP): 将长度 n/2n/2n/2mmm 编码为长度 2n2n2n 的消息 m^\hat{m}m^G,HG, HG,H 是随机预言机。
    • RSA-OAEP在ROM下是CCA安全的。(当RO实例化后可能不安全)
    • CPA攻击下,敌手不知道rrr,则mmm被完美保护;若要知道 rrr,则必须知道sss,这不可能。
    • CCA攻击下,无法有效进行解密查询,因为在应答前会检查明文中“00…0”。
    • 局限性:这个方案对RSA是安全的,但对其他TDP可能不是。
  27. OAEP改进

    • OAEP+对所有TDP都是CCA安全的
    • SAEP+更简单填充,同样安全
  28. 对RSA的实现攻击(续)

    • 计时攻击:[Kocher et al. 1997] 计算 cdc^dcd 所消耗的时间可能泄漏 ddd。 (需要高解析时钟)
    • 能耗攻击:[Kocher et al. 1999] 为计算cdc^dcd 智能卡消耗的能量可能泄漏ddd
    • 防御:将密文和随机数 rrr 绑定,解密 re⋅cr^{e}\cdot crec
    • 密钥生成问题:(在 OpenSSL RSA 密钥生成过程中):
    • 相同的 ppp 由多个设备产生 (源自启动时的低熵),但是不同的 qqq (源自额外的随机性).
      • 问题: 不同设备的 N1,N2N_1,N_2N1,N2 , gcd⁡(N1,N2)=?\gcd(N_1,N_2) = ?gcd(N1,N2)=?
      • 实验结果: 可分解 0.4% 的公开的HTTPS密钥。
  29. 对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]([mpcd(modp)],[mqcd(modq)])

    • 假设在计算 mqm_qmq 时发生错误,但在计算 mpm_pmp 时没有错误。

    • m′≡cd(modp)m' \equiv c^d \pmod pmcd(modp), m′≢cd(modq)m' \not \equiv c^d \pmod qmcd(modq)

    • (m′)e≡c(modp)(m')^e \equiv c \pmod p(m)ec(modp), (m′)e≢c(modq)(m')^e \not \equiv c \pmod q(m)ec(modq)

    • gcd⁡((m′)e−c,N)= ?\gcd((m')^e-c, N)=\ ?gcd((m)ec,N)= ?

    • 防御:检查输出 (但减慢 10% )。

  30. 总结

    • RSA问题是TPD,但书本上RSA加密不安全,RSA-OAEP在ROM下是CCA安全的。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值