【现代密码学】笔记7.1-7.3、10.4 RSA问题与加密 -- 数论与密码学困难性假设(素数、大整数分解、循环群)《introduction to modern cryphtography》
- 写在最前面
- 8.2 RSA问题与加密
- RSA问题
- RSA问题和分解 N N N
- RSA问题
- 整数分解问题
- 它们之间的关系
- 安全性影响
- 针对“书本上RSA”加密的攻击
- 质数与模算术
- 实践中的RSA加密
- 8.3 DH问题与加密
写在最前面
主要在 哈工大密码学课程 张宇老师课件 的基础上学习记录笔记。
内容补充:骆婷老师的PPT
《introduction to modern cryphtography》–Jonathan Katz, Yehuda Lindell(现代密码学——原理与协议)中相关章节
密码学复习笔记 这个博主好有意思
初步笔记,如有错误请指正
快速补充一些密码相关的背景知识
8.2 RSA问题与加密
-
本节学习第一个也是目前应用最广泛的公钥加密方案RSA。
-
目录:RSA问题,针对“书本上RSA”加密的攻击,实践中的RSA加密。
RSA问题
-
RSA概览
- RSA: Ron Rivest, Adi Shamir and Leonard Adleman, 三位作者于1977年发表RSA加密方案。
- RSA问题: 给定 N = p q N = pq N=pq (两个不同的大质数的乘积) 并且 y ∈ Z N ∗ y \in \mathbb{Z}^*_N y∈ZN∗,计算 y − e y^{-e} y−e,即 y y y模 N N N下的 e e e次方根。
- 开放问题:
RSA问题比分解 N 更容易吗?
- 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问题和分解 N N N
RSA问题和分解整数 (N) 的问题,都与RSA加密算法的安全性紧密相关。
RSA问题
RSA问题可以表述为:给定一个RSA公钥
(
N
,
e
)
(N, e)
(N,e) 和一个密文
c
c
c,找到一个明文
m
m
m 使得下面的等式成立:
m
e
≡
c
m
o
d
N
m^e \equiv c \mod N
me≡cmodN
这里,
N
N
N 是一个大合数,通常是两个大素数
p
p
p 和
q
q
q 的乘积,
e
e
e 是公钥的一部分,
m
m
m 是待求的明文。
整数分解问题
整数分解问题涉及,找出一个给定合数 N N N 的素数因子。在RSA加密的背景下, N = p q N = pq N=pq,其中 p p p 和 q q q 是两个大素数。
它们之间的关系
- 如果能分解 N N N:如果有人能有效地分解 N N N,即找到 p p p 和 q q q,那么他们可以计算出RSA的私钥。一旦有了私钥,就可以解决RSA问题,即解密任何用相应公钥加密的信息。
- 如果不能分解 N N N:即使不能分解 N N N,目前还不清楚是否存在其他方法可以解决RSA问题。换句话说,没有已知的方法可以在不分解 N N N 的情况下有效地解决RSA问题,但这并不意味着这样的方法不存在。
安全性影响
这个问题的不确定性是评估RSA加密算法安全性的一个关键因素。如果找到了一种比整数分解更有效的方法来解决RSA问题,那么RSA加密的安全性可能会受到严重影响。因此,密码学家和安全专家持续关注这个开放问题,并寻找可能的解决方案。同时,这也促进了对量子计算和其他潜在威胁对RSA算法影响的研究。
针对“书本上RSA”加密的攻击
-
书本上的RSA
- 构造:
- G e n \mathsf{Gen} Gen: 输入 1 n 1^n 1n 运行 G e n R S A ( 1 n ) \mathsf{GenRSA}(1^n) GenRSA(1n) 产生 N , e , d N,e,d N,e,d。 p k = ⟨ N , e ⟩ pk = \langle N,e \rangle pk=⟨N,e⟩ 和 s k = ⟨ N , d ⟩ sk = \langle N,d \rangle sk=⟨N,d⟩。
- E n c \mathsf{Enc} Enc: 输入 p k pk pk 和 m ∈ Z N ∗ m \in \mathbb{Z}^*_N m∈ZN∗,获得密文 c : = [ m e m o d N ] c:= [m^e \bmod N] c:=[memodN].
- D e c \mathsf{Dec} Dec: 输入 s k sk sk 和 m ∈ Z N ∗ m \in \mathbb{Z}^*_N m∈ZN∗,获得明文 m : = [ c d m o d N ] m:= [c^d \bmod N] m:=[cdmodN].
- 不安全性:由于“书本上的RSA”是确定性的,在我们已经提出的任何安全定义下都是不安全的。
- 下面学习问题:如何产生 N , e , d N,e,d N,e,d? 什么是 Z N ∗ \mathbb{Z}^*_N ZN∗? 如何计算 m e m o d N m^e \bmod N memodN? 这个难题是TDP? 为什么很难?
- 参考教材:《A Computational Introduction to Number Theory and Algebra》(Version 2) Victor Shoup。
- 构造:
质数与模算术
-
质数与模算术
- 整数集合 Z \mathbb{Z} Z, a , b , c ∈ Z a,b,c \in \mathbb{Z} a,b,c∈Z。
- a a a 整除 b b b: a ∣ b a \mid b a∣b 如果 ∃ c , a c = b \exists c, ac=b ∃c,ac=b (否则 a ∤ b a \nmid b a∤b). b b b 是 a a a 的倍数。如果 a ∉ { 1 , b } a \notin \{1,b\} a∈/{1,b},那么 a a a 是 b b b 的因子。
- p > 1 p > 1 p>1 是质数(素数),如果其没有因子;否则,是合数。
- ∀ a , b \forall a,b ∀a,b, ∃ \exists ∃ 商 q q q, 余数 r r r: a = q b + r a=qb+r a=qb+r, 且 0 ≤ r < b 0\le r < b 0≤r<b。
- 最大公因子 gcd ( a , b ) \gcd(a,b) gcd(a,b) 是最大的整数 c c c 使得 c ∣ a c\mid a c∣a 且 c ∣ b c\mid b c∣b。 gcd ( 0 , b ) = b \gcd(0,b)=b gcd(0,b)=b, gcd ( 0 , 0 ) \gcd(0,0) gcd(0,0)未定义。
- a a a 和 b b b 是互质,如果 gcd ( a , b ) = 1 \gcd(a,b)=1 gcd(a,b)=1。
- 余数 r = [ a m o d N ] = a − b ⌊ a / b ⌋ r= [a\bmod N] = a - b\lfloor a/b\rfloor r=[amodN]=a−b⌊a/b⌋ 并且 r < N r<N r<N. N N N 称为模。
- Z N = { 0 , 1 , … , N − 1 } = { a m o d 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}.
- a a a 是模 N N N 下可逆的 ⟺ gcd ( a , N ) = 1 \iff \gcd(a,N) = 1 ⟺gcd(a,N)=1。如果 a b ≡ 1 ( m o d N ) ab \equiv 1 \pmod N ab≡1(modN),那么 b = a − 1 b=a^{-1} b=a−1是模 N N N 下 a a a 的乘法逆。
-
模算术例子
-
欧几里德算法(辗转相除法): gcd ( a , b ) = gcd ( b , [ a m o d 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 , N a,N a,N,寻找 X , Y X,Y X,Y 使得 X a + Y N = gcd ( a , N ) Xa+YN = \gcd(a,N) Xa+YN=gcd(a,N) (贝祖定理)
-
例子,求11 (mod 17)下的逆元, a = 11 a = 11 a=11, N = 17 N = 17 N=17, X a + Y N = r Xa + YN = r Xa+YN=r
r X Y m 17 0 1 11 1 0 1 6 -1 1 1 5 2 -1 1 1 -3 2
-
-
求余然后相加/乘
- 计算 193028 ⋅ 190301 m o d 100 193028 \cdot 190301 \bmod 100 193028⋅190301mod100
-
消去律:如果 gcd ( a , N ) = 1 \gcd(a,N)=1 gcd(a,N)=1 且 a b ≡ a c ( m o d N ) ab \equiv ac \pmod N ab≡ac(modN),那么 b ≡ c ( m o d N ) b \equiv c \pmod N b≡c(modN).
- a = 3 , c = 10 , b = 2 , N = 24 a=3, c=10, b=2, N=24 a=3,c=10,b=2,N=24
-
-
Z N ∗ \mathbb{Z}_N^* ZN∗ 群
- Z N ∗ = 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 ∈ G g \circ h \in \mathbb{G} g∘h∈G.
- 单位元: ∃ \exists ∃ 单位元 e ∈ G e\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 ∘ g g \circ h =e = h \circ g g∘h=e=h∘g. h h h 是 g g g 的逆元.
- 结合律: ∀ g 1 , g 2 , g 3 ∈ G \forall g_1,g_2,g_3 \in \mathbb{G} ∀g1,g2,g3∈G, ( g 1 ∘ g 2 ) ∘ g 3 = g 1 ∘ ( g 2 ∘ g 3 ) (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∣ 是群的阶。
- 问题: Z N ∗ \mathbb{Z}_N^* ZN∗ 是乘法下的群吗? Z N \mathbb{Z}_N ZN 在乘法下呢? Z 15 ∗ = ? \mathbb{Z}_{15}^* = ? Z15∗=? Z 13 ∗ = ? \mathbb{Z}_{13}^* = ? Z13∗=?
-
群指数
- g m = def g ∘ g ∘ ⋯ ∘ g ⏟ m times . g^m \overset{\text{def}}{=} \underbrace{g\circ g\circ \cdots \circ g}_{m\; \text{times}}. gm=defmtimes g∘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.
- 注:课上证明,将群中每个元素与 g g g 相乘后连乘等于群中元素连乘。
- 例子:计算 3 ∈ Z 7 ∗ 3 \in \mathbb{Z}_{7}^* 3∈Z7∗ 的所有幂。
- 费马小定理: ∀ g ∈ G \forall g \in \mathbb{G} ∀g∈G and i i i, g i ≡ g [ i m o d ∣ G ∣ ] g^i \equiv g^{[i \bmod {|\mathbb{G}|}]} gi≡g[imod∣G∣].
- 注:这是欧拉定理的推论。
- 例子:计算 3 78 ∈ Z 7 ∗ 3^{78} \in \mathbb{Z}_{7}^* 378∈Z7∗
-
算术算法
- 加/减:线性时间 O ( n ) O(n) O(n).
- 乘:最初
O
(
n
2
)
O(n^2)
O(n2)。
- Karatsuba (1960,当时23岁): O ( n log 2 3 ) O(n^{\log_2 3}) O(nlog23) ( 2 b x 1 + x 0 ) × ( 2 b y 1 + y 0 ) (2^bx_1+x_0) \times (2^by_1+ y_0) (2bx1+x0)×(2by1+y0) 使用3个乘法。
- 注:因为 x 1 ⋅ y 0 + x 0 ⋅ y 1 = ( x 1 + x 0 ) ⋅ ( y 1 + y 0 ) − x 1 ⋅ y 1 − x 0 ⋅ y 0 x_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_0 x1⋅y0+x0⋅y1=(x1+x0)⋅(y1+y0)−x1⋅y1−x0⋅y0。
- 最佳渐进算法: O ( n log n ) O(n\log n) O(nlogn)。
- 除/求余: O ( n 2 ) O(n^2) O(n2)。
- 指数:
O
(
n
3
)
O(n^3)
O(n3),平方指数法,例如计算8次幂并不需要乘8次,而是计算4次幂的平方,而4次幂来自2次幂平方。
- 输入 g ∈ G g \in G g∈G; 指数 x = [ x n x n − 1 … x 2 x 1 x 0 ] 2 x=[x_nx_{n-1}\dots x_2x_1x_0]_2 x=[xnxn−1…x2x1x0]2
- 输出: g x g^x gx
- y ← g ; z ← 1 y \gets g; z \gets 1 y←g;z←1
- For
i
=
0
i = 0
i=0 to
n
n
n
- If ( x i = = 1 x_i == 1 xi==1){ z ← z × y z \gets z \times y z←z×y}
- y ← y 2 y \gets y^2 y←y2
- Return z z z
- 这里举个例子,例如算 g 9 g^9 g9
-
欧拉的Phi函数
- 欧拉phi函数: ϕ ( N ) = def ∣ Z N ∗ ∣ \phi(N) \overset{\text{def}}{=} |\mathbb{Z}_N^*| ϕ(N)=def∣ZN∗∣. 注:整数乘法群的阶
- 算法基本定理: N = ∏ i p i e i N = \prod_ip_i^{e_i} N=∏ipiei , { p i } \{p_i\} {pi} 是不同的质数, ϕ ( N ) = ∏ i p i e i − 1 ( p i − 1 ) \phi(N) = \prod_ip_i^{e_i-1}(p_i-1) ϕ(N)=∏ipiei−1(pi−1)。
- 例题: N = p q N=pq N=pq 其中 p , q p,q p,q 是不同质数。 ϕ ( N ) = ? \phi(N)=? ϕ(N)=? ϕ ( 12 ) = ? \phi(12)=? ϕ(12)=? ϕ ( 30 ) = ? \phi(30)=? ϕ(30)=?
- 欧拉定理与费马小定理: a ∈ Z N ∗ a \in \mathbb{Z}_N^* a∈ZN∗. a ϕ ( N ) ≡ 1 ( m o d N ) a^{\phi (N)} \equiv 1 \pmod N aϕ(N)≡1(modN). 注:前面证明过
- 如果 p p p 是质数并且 a ∈ { 1 , … , p − 1 } a \in \{1,\dotsc,p-1\} a∈{1,…,p−1},那么 a p − 1 ≡ 1 ( m o d p ) a^{p-1} \equiv 1 \pmod p ap−1≡1(modp). 注:因为质数 p p p乘法群的阶为 p − 1 p-1 p−1
- 例题: 3 43 m o d 49 = ? 3^{43} \bmod 49 = ? 343mod49=?
-
基于群指数函数的排列
- 指数函数 f e : f_e\;: fe: Z N ∗ → Z N ∗ \mathbb{Z}^*_N \to \mathbb{Z}^*_N ZN∗→ZN∗ by f e ( x ) = [ x e m o d N ] f_e(x) =[x^e \bmod N] fe(x)=[xemodN].
- 对指数函数求逆: y y y 的 e e e 次方根: x e ≡ y x^e \equiv y xe≡y, x ≡ y 1 / e x \equiv y^{1/e} x≡y1/e.
- 推论:如果 gcd ( e , ϕ ( N ) ) = 1 \gcd(e,\phi(N))=1 gcd(e,ϕ(N))=1,那么 f e f_e fe 是排列。
- 证明:令 d = [ e − 1 m o d ϕ ( N ) ] d = [e^{-1} \bmod \phi(N)] d=[e−1modϕ(N)],那么 f d f_d fd 是 f e f_e fe 的逆函数。 y ≡ x e ; f d ( y ) ≡ y d ≡ x e d ≡ x y \equiv x^{e};\quad f_{d}(y) \equiv y^d \equiv x^{ed} \equiv x y≡xe;fd(y)≡yd≡xed≡x.
- 例题:在 Z 10 ∗ \mathbb{Z}^*_{10} Z10∗ 中, e = 3 , d = ? , f e ( 3 ) = ? , f d ( f e ( 3 ) ) = ? , 9 1 3 = ? e = 3,\ d = ?,\ f_{e}(3) = ?,\ f_{d}(f_{e}(3)) = ?,\ 9^{\frac{1}{3}} = ? e=3, d=?, fe(3)=?, fd(fe(3))=?, 931=?
- 问题:如果对于某些特别的 N N N无法计算 ϕ ( N ) \phi(N) ϕ(N) ,那么会如何?如果不能分解 N N N 呢?
-
整数分解是难的
- 分解 N = p q N=pq N=pq. p , q p,q p,q 长度相同为 n n n.
- 尝试分解: O ( N ⋅ p o l y l o g ( N ) ) \mathcal{O}(\sqrt{N}\cdot \mathsf{polylog}(N)) O(N⋅polylog(N)).
- Pollard’s p − 1 p-1 p−1 方法: 当 p − 1 p-1 p−1 具有小质数因子时有效。
- Pollard’s rho 方法: O ( N 1 / 4 ⋅ p o l y l o g ( N ) ) \mathcal{O}(N^{1/4}\cdot \mathsf{polylog}(N)) O(N1/4⋅polylog(N)).
- 二次筛法 [Carl Pomerance]: 亚指数时间 O ( exp ( n ⋅ log n ) ) \mathcal{O}(\exp(\sqrt{n\cdot \log n})) O(exp(n⋅logn)).
- 已知最优算法为通用数域筛法 [Pollard]: O ( exp ( n 1 / 3 ⋅ ( log n ) 2 / 3 ) ) \mathcal{O}(\exp(n^{1/3}\cdot(\log n)^{2/3})) O(exp(n1/3⋅(logn)2/3)).
-
RSA问题是难的
-
思路:分解难 ⟹ \implies ⟹ 对于 N = p q N=pq N=pq, 找到 p , q p,q p,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 m o d ϕ ( N ) e^{-1} \bmod \phi(N) e−1modϕ(N) 难
这里存在一段空白
⟹ \implies ⟹ RSA 问题难:给定 y ∈ Z N ∗ y \in \mathbb{Z}^*_N y∈ZN∗, 计算 y − e y^{-e} y−e modulo N N N.
-
开放问题:RSA 比分解容易?
-
-
产生随机质数
- 为了构造RSA问题,首先需要一个产生随机质数的方法:随机选择的一个数,测试其是否为质数。
- 该方法的有效性需要回答两个问题:(1) 随机选择的数是质数的概率多大?(2) 是否能够有效地测试其是否为质数?
- 对于问题1, ∃ \exists ∃ 常数 c c c 使得, ∀ n > 1 \forall n>1 ∀n>1, 一个随机选择的 n n n 比特数为质数的概率至少 c / n c/n c/n。
- 对于问题2,如果 N N N 是质数,那么Miller-Rabin质性测试始终输出质数。如果 N N N 是合数,那么算法输出质数的概率至多 2 − t 2^{-t} 2−t。
-
产生RSA问题
- 令 G e n M o d u l u s ( 1 n ) \mathsf{GenModulus}(1^n) GenModulus(1n) 为一个概率多项式时间算法,输入 1 n 1^n 1n, 输出 ( N , p , q ) (N,p,q) (N,p,q) ,其中 N = p q N=pq N=pq, 并且 p , q p,q p,q 是 n n n 比特质数,除了有可忽略的概率失败。
- 产生RSA问题算法简述:
- 由 G e n M o d u l u s ( 1 n ) \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);
- 寻找一个 e e e,使得 gcd ( e , ϕ ( N ) ) = 1 \gcd(e,\phi(N))=1 gcd(e,ϕ(N))=1;
- 计算 d : = [ e − 1 m o d ϕ ( N ) ] d := [e^{-1} \bmod \phi(N)] d:=[e−1modϕ(N)];
- 返回 N , e , d N,e,d N,e,d
-
RSA假设
- RSA实验
R
S
A
i
n
v
A
,
G
e
n
R
S
A
(
n
)
\mathsf{RSAinv}_{\mathcal{A},\mathsf{GenRSA}}(n)
RSAinvA,GenRSA(n):
- 运行 G e n R S A ( 1 n ) \mathsf{GenRSA}(1^n) GenRSA(1n) 来产生 ( N , e , d ) (N,e,d) (N,e,d)。
- 选择 y ← Z N ∗ y \gets \mathbb{Z}^*_N y←ZN∗。
- 敌手 A \mathcal{A} A 给定 N , e , y N,e,y N,e,y, 并输出 x ∈ Z N ∗ x \in \mathbb{Z}^*_N x∈ZN∗.
- R S A i n v A , G e n R S A ( n ) = 1 \mathsf{RSAinv}_{\mathcal{A},\mathsf{GenRSA}}(n)=1 RSAinvA,GenRSA(n)=1 ,实验成功,如果 x e ≡ y ( m o d N ) x^e \equiv y \pmod N xe≡y(modN),否则实验失败 0 。
- 定义:RSA问题相对于 G e n R S A \mathsf{GenRSA} GenRSA是难的,如果 ∀ \forall ∀ PPT算法 A \mathcal{A} A, ∃ \exists ∃ n e g l \mathsf{negl} negl 使得, Pr [ R S A i n v A , G e n R S A ( n ) = 1 ] ≤ n e g l ( n ) . \Pr[\mathsf{RSAinv}_{\mathcal{A},\mathsf{GenRSA}}(n) = 1] \le \mathsf{negl}(n). Pr[RSAinvA,GenRSA(n)=1]≤negl(n).
- RSA实验
R
S
A
i
n
v
A
,
G
e
n
R
S
A
(
n
)
\mathsf{RSAinv}_{\mathcal{A},\mathsf{GenRSA}}(n)
RSAinvA,GenRSA(n):
-
构造陷门排列
- 用
G
e
n
R
S
A
\mathsf{GenRSA}
GenRSA 来定义一个排列族:
- G e n \mathsf{Gen} Gen: 输入 1 n 1^n 1n, 运行 G e n R S A ( 1 n ) \mathsf{GenRSA}(1^n) GenRSA(1n) 来产生 ( N , e , d ) (N,e,d) (N,e,d) 并且 I = ⟨ N , e ⟩ , t d = d I=\langle N,e \rangle, \mathsf{td}=d I=⟨N,e⟩,td=d, 令 D I = D t d = Z N ∗ \mathcal{D}_I = \mathcal{D}_{\mathsf{td}} = \mathbb{Z}^*_N DI=Dtd=ZN∗.
- S a m p \mathsf{Samp} Samp: 输入 I I I, 挑选一个随机元素 x x x of Z N ∗ \mathbb{Z}^*_N ZN∗.
- f I ( x ) = [ x e m o d N ] f_{I}(x) = [ x^e \bmod N] fI(x)=[xemodN].
- 确定性求逆算法 I n v t d ( y ) = [ y d m o d N ] \mathsf{Inv}_{\mathsf{td}}(y) = [ y^d \bmod N] Invtd(y)=[ydmodN].
- 将RSA问题规约到陷门排列求逆问题。
- 用
G
e
n
R
S
A
\mathsf{GenRSA}
GenRSA 来定义一个排列族:
-
回顾“书本上的RSA”
- 略
-
攻击带有小 e e e的“书本上的RSA”
- 小
e
e
e 和 小
m
m
m 令模算术失去作用,不再是难题。
- 如果 e = 3 e=3 e=3 并且 m < N 1 / 3 m < N^{1/3} m<N1/3,那么 c = m 3 c = m^3 c=m3 并且 m = m= m= ?
- 在混合加密中,1024比特 RSA 与 128比特 AES。
- 当小
e
e
e 被使用时通用攻击:
- e = 3 e=3 e=3, 同一个消息 m m m 被发送给 3 个不同的接收者。
- c 1 = [ m 3 m o d N 1 ] c_1= [ m^3 \bmod N_1] c1=[m3modN1], c 2 = [ m 3 m o d N 2 ] c_2= [ m^3 \bmod N_2] c2=[m3modN2], c 3 = [ m 3 m o d N 3 ] c_3= [ m^3 \bmod N_3] c3=[m3modN3].
- N 1 , N 2 , N 3 N_1,N_2,N_3 N1,N2,N3 互质, 并且 N ∗ = N 1 N 2 N 3 N^*=N_1N_2N_3 N∗=N1N2N3,使用中国剩余定理可知, ∃ \exists ∃ 唯一的 c ^ < N ∗ \hat{c} < N^* c^<N∗:
- c ^ ≡ c 1 ( m o d N 1 ) \hat{c} \equiv c_1 \pmod{N_1} c^≡c1(modN1), c ^ ≡ c 2 ( m o d N 2 ) \hat{c} \equiv c_2 \pmod{N_2} c^≡c2(modN2), c ^ ≡ c 3 ( m o d N 3 ) \hat{c} \equiv c_3 \pmod{N_3} c^≡c3(modN3).
- c ^ ≡ m 3 ( m o d N ∗ ) \hat{c} \equiv m^3 \pmod{N^*} c^≡m3(modN∗). 由于 m 3 < N ∗ m^3 < N^* m3<N∗, m = c ^ 1 / 3 m = \hat{c}^{1/3} m=c^1/3.
- 小
e
e
e 和 小
m
m
m 令模算术失去作用,不再是难题。
-
对恢复明文的二次改进
- 如果 1 ≤ m < L = 2 ℓ 1 \le m < \mathcal{L} = 2^{\ell} 1≤m<L=2ℓ, 存在一个算法可以在 L \sqrt{\mathcal{L}} L 时间恢复 m m m 。
- 思路:$ c \equiv m^e = (r\cdot s)^e = r^e\cdot s^e \pmod N $
- 算法:
- 输入:公钥 ⟨ N , e ⟩ \langle N,e \rangle ⟨N,e⟩; 密文 c c c; 参数 ℓ \ell ℓ
- 输出: m < 2 ℓ m < 2^{\ell} m<2ℓ 使得 m e ≡ c ( m o d N ) m^e \equiv c \pmod N me≡c(modN)
- T : = 2 α ℓ T := 2^{\alpha \ell} T:=2αℓ // 1 2 < constant α < 1 \frac{1}{2} < \text{constant}\; \alpha <1 21<constantα<1
- For{ r = 1 r=1 r=1 to T T T} { x r : = [ c / r e m o d N ] x_r := [c/r^e \bmod N] xr:=[c/remodN]}
- sort pairs { ( r , x r ) } r = 1 T \{ (r,x_r)\}^T_{r=1} {(r,xr)}r=1T by x r x_r xr
- For
s
=
1
s=1
s=1 to
T
T
T
- If
[
s
e
m
o
d
N
]
=
?
x
r
[s^e \bmod N] \overset{?}{=} x_r
[semodN]=?xr for some
r
r
r
- Return [ r ⋅ s m o d N ] [r\cdot s \bmod N] [r⋅smodN]
- If
[
s
e
m
o
d
N
]
=
?
x
r
[s^e \bmod N] \overset{?}{=} x_r
[semodN]=?xr for some
r
r
r
- Return fail
-
共模攻击
- 共模攻击使用相同的模数 N N N.
- 情况1:多个用户带有自己的密钥。每个用户可以以自己的 e , d e,d e,d 计算 ϕ ( N ) \phi(N) ϕ(N) ,然后找到其他人的 d d d.
- 情况2:用两个公钥为同一个消息加密。
- 假设 gcd ( e 1 , e 2 ) = 1 \gcd(e_1,e_2)=1 gcd(e1,e2)=1, c 1 ≡ m e 1 c_1 \equiv m^{e_1} c1≡me1 and c 2 ≡ m e 2 ( m o d N ) c_2 \equiv m^{e_2} \pmod N c2≡me2(modN). ∃ X , Y \exists X,Y ∃X,Y 使得 X e 1 + Y e 2 = 1 Xe_1 + Ye_2 = 1 Xe1+Ye2=1 (贝祖定理).
- c 1 X ⋅ c 2 Y ≡ m X e 1 m Y e 2 ≡ m 1 ( m o d N ) . 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 , e 1 = 3 , e 2 = 5 , c 1 = 8 , c 2 = 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 ← Z N ∗ r \gets \mathbb{Z}^*_N r←ZN∗ 并计算 c ′ = [ r e ⋅ c m o d N ] c' = [r^e\cdot c \bmod N] c′=[re⋅cmodN],使用CCA获得 m ′ m' m′ 。那么, m = ? m= ? m=?
- 在拍卖中讲价格翻倍: c = [ m e m o d N ] c = [m^e \bmod N] c=[memodN]. c ′ = [ 2 e c m o d N ] c'= [2^ec \bmod N] c′=[2ecmodN].
-
RSA实现问题
- 将二进制串编码为 Z N ∗ \mathbb{Z}^*_N ZN∗ 中元素: ℓ = ∥ N ∥ \ell = \|N\| ℓ=∥N∥。任意长度为 ℓ − 1 \ell - 1 ℓ−1 的二进制串 m m m 可以被看作是 Z N Z_N ZN 中元素。尽管 m m m 不在 Z N ∗ Z_N^* ZN∗ 中,RSA 仍工作。
- e e e 的选择: e = 3 e=3 e=3 或小 d d d 都是坏选择。 推荐 e = 65537 = 2 16 + 1 e=65537=2^{16}+1 e=65537=216+1
- 使用中国剩余定理来加速解密:$ [c^d \bmod N] \leftrightarrow ([c^d \bmod p],[c^d \bmod q]). $
- 假设一个 n n n 比特整数指数预算需要 n 3 n^3 n3 操作。RSA 解密花费 ( 2 n ) 3 = 8 n 3 (2n)^3=8n^3 (2n)3=8n3,其中使用中国剩余定理需要 2 n 3 2n^3 2n3。
-
Padded RSA
- 思路:添加随机性来改进安全
- 构造:
- 令 ℓ \ell ℓ 为一个函数,对所有 n n n, ℓ ( n ) ≤ 2 n − 2 \ell(n) \le 2n-2 ℓ(n)≤2n−2,为被加密的消息长度。
- G e n \mathsf{Gen} Gen: 输入 1 n 1^n 1n, 运行 G e n R S A ( 1 n ) \mathsf{GenRSA}(1^n) GenRSA(1n) 来产生 ( N , e , d ) (N,e,d) (N,e,d). 输出 p k = ⟨ N , e ⟩ pk = \langle N,e \rangle pk=⟨N,e⟩ 和 s k = ⟨ N , d ⟩ sk = \langle N,d \rangle sk=⟨N,d⟩。
- E n c \mathsf{Enc} Enc: 输入 m ∈ { 0 , 1 } ℓ ( n ) m \in \{0,1\}^{\ell(n)} m∈{0,1}ℓ(n), 选择随机串 r ← { 0 , 1 } ∥ N ∥ − ℓ ( n ) − 1 r \gets \{0,1\}^{\|N\| - \ell(n)-1} r←{0,1}∥N∥−ℓ(n)−1. 输出 c : = [ ( r ∥ m ) e m o d N ] c:=[(r\|m)^e \bmod N] c:=[(r∥m)emodN]。注:填充随机串后加密
- D e c \mathsf{Dec} Dec: 计算 m ^ : = [ c d m o d N ] \hat{m} := [c^d \bmod N] m^:=[cdmodN], 并输出 m ^ \hat{m} m^ 中的低 ℓ ( n ) \ell(n) ℓ(n)个比特。注:这部分为明文
- ℓ \ell ℓ 不应该太大 (理论上的 r r r 太小) 也不应该太小 (实践中的 m m m 太小)。
- 定理:如果RSA问题相对于 G e n R S A \mathsf{GenRSA} GenRSA 是难的,那么基于 ℓ ( n ) = O ( log n ) \ell(n)=\mathcal{O}(\log n) ℓ(n)=O(logn) 的构造是CPA安全的。
- 证明:与对称加密中CPA安全方案类似。
实践中的RSA加密
-
对RSA的实现攻击
- 对HTTPS中PKCS1 v1.5的简化的CCA攻击 [Bleichenbacher]
- 服务器对给定的密文来应答明文的最高有效位是否等于1 (版本号) 。攻击者发送 c ′ = ( 2 r ) e ⋅ c c' = (2^{r})^{e}\cdot c c′=(2r)e⋅c。如果收到 Y e s Yes Yes,那么明文中第 ( r + 1 ) (r+1) (r+1)最高有效位= ?
- 防御:处理格式不正确的消息和格式正确的消息的方式应该是不可区分的。[RFC 5246]
-
PKCS #1 v2.1 (RSAES-OAEP)
- 最优非对称加密填充(Optimal Asymmetric Encryption Padding,OAEP): 将长度 n / 2 n/2 n/2 的 m m m 编码为长度 2 n 2n 2n 的消息 m ^ \hat{m} m^ 。 G , H G, H G,H 是随机预言机。
- RSA-OAEP在ROM下是CCA安全的。(当RO实例化后可能不安全)
- CPA攻击下,敌手不知道 r r r,则 m m m被完美保护;若要知道 r r r,则必须知道 s s s,这不可能。
- CCA攻击下,无法有效进行解密查询,因为在应答前会检查明文中“00…0”。
- 局限性:这个方案对RSA是安全的,但对其他TDP可能不是。
-
OAEP改进
- OAEP+对所有TDP都是CCA安全的
- SAEP+更简单填充,同样安全
-
对RSA的实现攻击(续)
- 计时攻击:[Kocher et al. 1997] 计算 c d c^d cd 所消耗的时间可能泄漏 d d d。 (需要高解析时钟)
- 能耗攻击:[Kocher et al. 1999] 为计算 c d c^d cd 智能卡消耗的能量可能泄漏 d d d。
- 防御:将密文和随机数 r r r 绑定,解密 r e ⋅ c r^{e}\cdot c re⋅c。
- 密钥生成问题:(在 OpenSSL RSA 密钥生成过程中):
- 相同的
p
p
p 由多个设备产生 (源自启动时的低熵),但是不同的
q
q
q (源自额外的随机性).
- 问题: 不同设备的 N 1 , N 2 N_1,N_2 N1,N2 , gcd ( N 1 , N 2 ) = ? \gcd(N_1,N_2) = ? gcd(N1,N2)=?
- 实验结果: 可分解 0.4% 的公开的HTTPS密钥。
-
对RSA的故障攻击
-
故障攻击:在解密过程中 c d m o d N c^d\bmod N cdmodN 发生的计算机故障可能泄漏 d d d 。
-
之前提到过使用中国剩余定理来加速解密:
[ c d m o d N ] ↔ ( [ m p ≡ c d ( m o d p ) ] , [ m q ≡ c d ( m o d q ) ] ) [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)])
-
假设在计算 m q m_q mq 时发生错误,但在计算 m p m_p mp 时没有错误。
-
m ′ ≡ c d ( m o d p ) m' \equiv c^d \pmod p m′≡cd(modp), m ′ ≢ c d ( m o d q ) m' \not \equiv c^d \pmod q m′≡cd(modq)。
-
( m ′ ) e ≡ c ( m o d p ) (m')^e \equiv c \pmod p (m′)e≡c(modp), ( m ′ ) e ≢ c ( m o d q ) (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安全的。
8.3 DH问题与加密
-
本节学习基于循环群上离散对数问题的DH问题及Elgamal加密方案。
-
目录:循环群与离散对数,DH假设和应用,Elgamal加密方案。
-
循环群(Cyclic Groups)与生成元(Generators)
- G \mathbb{G} G 是一个群并且一个元素 g ∈ G g \in \mathbb{G} g∈G通过运算生成一个子群 ⟨ g ⟩ = def { g 0 , g 1 , … , } = { g 0 , g 1 , … , g i − 1 } \langle g \rangle \overset{\text{def}}{=} \{ g^0,g^1,\dotsc,\} = \{ g^0,g^1,\dotsc, g^{i-1}\} ⟨g⟩=def{g0,g1,…,}={g0,g1,…,gi−1}。
- g g g 的阶是最小的正整数 i i i 令 g i = 1 g^i=1 gi=1。
- G \mathbb{G} G 是一个循环群(cyclic group)如果 ∃ g \exists\;g ∃g 有阶 m = ∣ G ∣ m = |\mathbb{G}| m=∣G∣. ⟨ g ⟩ = G \langle g \rangle = \mathbb{G} ⟨g⟩=G, g g g 是 G \mathbb{G} G 的生成元。注:循环群中存在一个元素通过指数运算可生成整个群中每个元素。
- 例题: 乘法下的 Z 6 ∗ \mathbb{Z}_6^* Z6∗, Z 7 ∗ \mathbb{Z}_7^* Z7∗,或 Z 8 ∗ \mathbb{Z}_8^* Z8∗ 是循环群吗? 找到生成元。
-
离散对数
- 如果 G \mathbb{G} G 是阶为 q q q 的循环群,那么 ∃ \exists ∃ 生成元 g ∈ G g \in \mathbb{G} g∈G 使得 { g 0 , g 1 , … , g q − 1 } = G \{ g^0,g^1,\dotsc,g^{q-1}\} = \mathbb{G} {g0,g1,…,gq−1}=G。
- ∀ h ∈ G \forall h \in \mathbb{G} ∀h∈G, ∃ \exists ∃ 唯一的 x ∈ Z q x \in \mathbb{Z}_q x∈Zq 使得 g x = h g^x = h gx=h。
- x = log g h x= \log_gh x=loggh 是以 g g g为底 h h h的离散对数(discrete logarithm)。
- 如果 g x ′ = h g^{x'}=h gx′=h, 那么 log g h = [ x ′ m o d q ] \log_gh = [x' \bmod q] loggh=[x′modq]。
- log g 1 = 0 \log_g1=0 logg1=0 并且 log g ( h 1 ⋅ h 2 ) = [ ( log g h 1 + log g h 2 ) m o d q ] \log_g(h_1\cdot h_2) = [(\log_gh_1+\log_gh_2) \bmod q] logg(h1⋅h2)=[(loggh1+loggh2)modq]。
-
离散对数算法概览
- 给定一个生成元 g ∈ G g \in \mathbb{G} g∈G 并且 y ∈ ⟨ g ⟩ y \in \langle g \rangle y∈⟨g⟩,求 x x x 使得 g x = y g^x=y gx=y.
- 蛮力: O ( q ) \mathcal{O}(q) O(q), q = o r d ( g ) q = \mathsf{ord}(g) q=ord(g) 是 ⟨ g ⟩ \langle g\rangle ⟨g⟩ 的阶。
- Baby-step/giant-step [Shanks]: O ( q ⋅ p o l y l o g ( q ) ) \mathcal{O}(\sqrt{q}\cdot \mathsf{polylog}(q)) O(q⋅polylog(q)).
- Pohlig-Hellman算法:当 q q q 有较小因子。
- Index calculus 法: O ( exp ( n ⋅ log n ) ) \mathcal{O}(\exp{(\sqrt{n\cdot \log n})}) O(exp(n⋅logn)).
- 已知最好的算法是通用数域筛法: O ( exp ( n 1 / 3 ⋅ ( log n ) 2 / 3 ) ) \mathcal{O}(\exp(n^{1/3}\cdot(\log n)^{2/3})) O(exp(n1/3⋅(logn)2/3)).
- 椭圆曲线群 vs. Z p ∗ \mathbb{Z}_p^* Zp∗: 在保证安全性相同的同时,更高效。(1024-bit Z p ∗ \mathbb{Z}_p^* Zp∗ 和 132-bit 椭圆曲线都需要 2 66 2^{66} 266 步来破解。)
-
使用质数阶群
- 定理:如果 G \mathbb{G} G 是质数阶,那么 G \mathbb{G} G 是循环群。除单位元外,所有 g ∈ G g \in \mathbb{G} g∈G 是生成元。
- 根据拉格朗日定理,任意元素的阶都等于群的阶。
- 拉格朗日定理:子群阶可以整除群阶。
⟨
g
⟩
\langle g \rangle
⟨g⟩ 是
G
\mathbb{G}
G 子群,并且
∣
⟨
g
⟩
∣
∣
∣
G
∣
|\langle g \rangle| \mid |\mathbb{G}|
∣⟨g⟩∣∣∣G∣。
- 思路:由一个子群可以派生覆盖了整个群的若干子集,这些子集的阶与子群相同,并且这些子集彼此不相交。
- 设群 G \mathbb{G} G的子群 H H H,陪集(coset) g H gH gH( g g g和 H H H中每个元素 h h h运算构成的集合)和子群 H H H的阶相同。
- 子群的任意两个陪集
g
1
H
g_1H
g1H和
g
2
H
g_2H
g2H。
- 或者相同,如果 g 1 − 1 g 2 ∈ H g_1^{-1}g_2 \in H g1−1g2∈H。 g 1 ( g 1 − 1 g 2 ) h ∈ g 1 H g_1(g_1^{-1}g_2 )h \in g_1H g1(g1−1g2)h∈g1H, g 2 h ∈ g 1 H g_2h \in g_1H g2h∈g1H。
- 或者没有交集,如果 g 1 − 1 g 2 ∉ H g_1^{-1}g_2 \notin H g1−1g2∈/H。采用反证法,如果有交集,则 g 1 h 1 = g 2 h 2 g_1h_1 = g_2h_2 g1h1=g2h2, g 1 − 1 g 2 = h 1 h 2 − 1 ∈ H g_1^{-1}g_2 = h_1h_2^{-1} \in H g1−1g2=h1h2−1∈H,矛盾。
- 因此,群可以划分为任意子群的若干不相交陪集,每个陪集阶相同,群的阶就是子群的整数倍。
- 推荐参考:https://brilliant.org/wiki/lagranges-theorem/
- 离散对数问题在质数阶群上是最难的。
- 在质数阶群上找一个生成元很简单。
- 任何非零指数在以质数阶为模下都可逆。
- DDH问题是难题的必要条件是 D H g ( h 1 , h 2 ) \mathsf{DH}_g(h_1,h_2) DHg(h1,h2) 与群中随机元素之间是不可区分的。在质数阶群上这基本成立。
-
产生质数阶(子)群
- 如果 p p p 是质数,那么 Z p ∗ \mathbb{Z}^*_p Zp∗ 是乘法群。
- y ∈ Z p ∗ y \in \mathbb{Z}^*_p y∈Zp∗ 是模 p p p下的二次剩余(quadratic residue modulo),如果 ∃ x ∈ Z p ∗ \exists x \in \mathbb{Z}^*_p ∃x∈Zp∗ 使得 x 2 ≡ y ( m o d p ) x^2 \equiv y \pmod p x2≡y(modp)
- 例题: Z 7 ∗ \mathbb{Z}_{7}^{*} Z7∗ 下的二次剩余?
- QR集合是一个子群(满足群条件),阶为 ( p − 1 ) / 2 (p-1)/2 (p−1)/2,因为 x 2 ≡ ( p − x ) 2 ( m o d p ) x^2 \equiv (p-x)^2 \pmod p x2≡(p−x)2(modp)。
- p p p 是一个强质数(strong prime),如果 p = 2 q + 1 p=2q+1 p=2q+1 且 q q q 是质数。
- 强质数下的二次剩余子群是一个循环群,因为群的阶是质数。
- 循环群生成算法:产生一个强质数 p p p,阶为 q = ( p − 1 ) / 2 q=(p-1)/2 q=(p−1)/2,随机选择一个 x ∈ Z p ∗ x \in \mathbb{Z}^*_p x∈Zp∗,得到生成元 g = x 2 g=x^2 g=x2,输出 p , q , g p, q, g p,q,g。
-
离散对数假设
- 离散对数(discrete logarithm)实验
D
L
o
g
A
,
G
(
n
)
\mathsf{DLog}_{\mathcal{A},\mathcal{G}}(n)
DLogA,G(n):
- 运行一个群生成算法 G ( 1 n ) \mathcal{G}(1^n) G(1n) 来产生 ( G , q , g ) (\mathbb{G},q,g) (G,q,g),其中 G \mathbb{G} G 是阶为 q q q ( ∥ q ∥ = n \|q\|=n ∥q∥=n) 的循环群,并且 g g g 是 G \mathbb{G} G 的生成元。
- 挑选一个 h ← G h \gets \mathbb{G} h←G. ( x ′ ← Z q x' \gets \mathbb{Z}_q x′←Zq and h : = g x ′ h := g^{x'} h:=gx′)
- 敌手 A \mathcal{A} A 给定 G , q , g , h \mathbb{G}, q, g, h G,q,g,h,并且输出 x ∈ Z q x \in \mathbb{Z}_q x∈Zq.
- 实验成功 D L o g A , G ( n ) = 1 \mathsf{DLog}_{\mathcal{A},\mathcal{G}}(n) = 1 DLogA,G(n)=1,如果 g x = h g^x = h gx=h, 否则 0 。
- 定义:离散对数问题相对于群 G \mathcal{G} G是难的,如果 ∀ \forall ∀ ppt 算法 A \mathcal{A} A, ∃ \exists ∃ n e g l \mathsf{negl} negl 使得 Pr [ D L o g A , G ( n ) = 1 ] ≤ n e g l ( n ) . \Pr[\mathsf{DLog}_{\mathcal{A},\mathcal{G}}(n)=1] \le \mathsf{negl}(n). Pr[DLogA,G(n)=1]≤negl(n).
- 离散对数(discrete logarithm)实验
D
L
o
g
A
,
G
(
n
)
\mathsf{DLog}_{\mathcal{A},\mathcal{G}}(n)
DLogA,G(n):
-
DH假设
- 计算性DH(Computational Diffie-Hellman, CDH)问题: D H g ( h 1 , h 2 ) = def g log g h 1 ⋅ log g h 2 \mathsf{DH}_g(h_1,h_2) \overset{\text{def}}{=} g^{\log_gh_1\cdot \log_gh_2} DHg(h1,h2)=defgloggh1⋅loggh2
- 判断性DH(Decisional Diffie-Hellman, DDH))问题:区分 D H g ( h 1 , h 2 ) \mathsf{DH}_g(h_1,h_2) DHg(h1,h2) 与一个随机的群元素 h ′ h' h′.
- 定义:DDH问题与 G \mathcal{G} G相关的是难的,如果 ∀ \forall ∀ ppt A \mathcal{A} A, ∃ \exists ∃ n e g l \mathsf{negl} negl 使得 ∣ Pr [ A ( G , q , g , g x , g y , g z ) = 1 ] − Pr [ A ( G , q , g , g x , g y , g x y ) = 1 ] ∣ ≤ n e g l ( n ) . |\Pr[\mathcal{A}(\mathbb{G},q,g,g^x,g^y,g^z)=1] - \Pr[\mathcal{A}(\mathbb{G},q,g,g^x,g^y,g^{xy})=1]|\le \mathsf{negl}(n). ∣Pr[A(G,q,g,gx,gy,gz)=1]−Pr[A(G,q,g,gx,gy,gxy)=1]∣≤negl(n).
- DL, CDH 和 DDH 的难解性:DDH 比 CDH 和 DL 容易。
-
安全密钥交换实验
-
密钥交换实验(key-exchange experiment) K E A , Π e a v ( n ) \mathsf{KE}^{\mathsf{eav}}_{\mathcal{A},\Pi}(n) KEA,Πeav(n):
- 双方持有安全参数 1 n 1^n 1n 执行协议 Π \Pi Π。 Π \Pi Π 执行的结果为对话记录 (transcript) t r a n s \mathsf{trans} trans 包含双方发送的所有消息,以及各方都输出的密钥 k k k 。
- 选择一个随机比特 b ← { 0 , 1 } b \gets \{0,1\} b←{0,1} 。 如果 b = 0 b=0 b=0 那么选择 k ^ ← { 0 , 1 } n \hat{k} \gets \{0,1\}^n k^←{0,1}n u.a.r;如果 b = 1 b=1 b=1 那么令 k ^ : = k \hat{k} :=k k^:=k。
- 敌手 A \mathcal{A} A 给定 t r a n s \mathsf{trans} trans 和 k ^ \hat{k} k^, 并且输出一个比特 b ′ b' b′。
- K E A , Π e a v ( n ) = 1 \mathsf{KE}^{\mathsf{eav}}_{\mathcal{A},\Pi}(n)=1 KEA,Πeav(n)=1 如果 b ′ = b b'=b b′=b, 否则 0 。
-
定义:一个密钥交换协议 Π \Pi Π 在出现窃听者攻击下是安全的,如果 ∀ \forall ∀ ppt A \mathcal{A} A, ∃ \exists ∃ n e g l \mathsf{negl} negl 使得
$ \Pr[\mathsf{KE}^{\mathsf{eav}}_{\mathcal{A},\Pi}(n) = 1] < \frac{1}{2} + \mathsf{negl}(n). $
-
-
DH密钥交换协议
- K E ^ A , Π e a v \widehat{\mathsf{KE}}^{\mathsf{eav}}_{\mathcal{A},\Pi} KE A,Πeav 表示一个实验,其中如果 b = 0 b=0 b=0 ,敌手被给予 k ^ ← G \hat{k} \gets \mathbb{G} k^←G。
- 定理:如果DDH问题与 G \mathcal{G} G相关是难的,那么DH 密钥交换协议 Π \Pi Π 在出现窃听者时是安全的 (对应改动的实验 K E ^ A , Π e a v \widehat{\mathsf{KE}}^{\mathsf{eav}}_{\mathcal{A},\Pi} KE A,Πeav)。
- 不安全性:在主动的敌手,中间人,攻击下是不安全的 (Man-In-The-Middle)。敌手在中间与双方分别通信,通信双方无法发现在与敌手通信,敌手可以与双方分别协商出密钥。
-
证明
- $\Pr \left[ \widehat{\mathsf{KE}}^{\mathsf{eav}}_{\mathcal{A},\Pi} =1\right] $ = 1 2 ⋅ Pr [ K E ^ A , Π e a v = 1 ∣ b = 1 ] + 1 2 ⋅ Pr [ K E ^ A , Π e a v = 1 ∣ b = 0 ] = \frac{1}{2}\cdot \Pr\left[ \widehat{\mathsf{KE}}^{\mathsf{eav}}_{\mathcal{A},\Pi} =1 | b=1\right] + \frac{1}{2}\cdot \Pr\left[ \widehat{\mathsf{KE}}^{\mathsf{eav}}_{\mathcal{A},\Pi} =1 | b=0\right] =21⋅Pr[KE A,Πeav=1∣b=1]+21⋅Pr[KE A,Πeav=1∣b=0]
- 如果 b = 1 b=1 b=1, 那么给真密钥;否则给随机的 g z g^z gz.
- = 1 2 ⋅ Pr [ A ( g x , g y , g x y ) = 1 ] + 1 2 ⋅ Pr [ A ( g x , g y , g z ) = 0 ] = \frac{1}{2}\cdot \Pr\left[ \mathcal{A}(g^x,g^y,g^{xy})=1 \right] + \frac{1}{2}\cdot \Pr\left[ \mathcal{A}(g^x,g^y,g^z)=0 \right] =21⋅Pr[A(gx,gy,gxy)=1]+21⋅Pr[A(gx,gy,gz)=0]
- = 1 2 ⋅ Pr [ A ( g x , g y , g x y ) = 1 ] + 1 2 ⋅ ( 1 − Pr [ A ( g x , g y , g z ) = 1 ] ) = \frac{1}{2}\cdot \Pr\left[ \mathcal{A}(g^x,g^y,g^{xy})=1 \right] + \frac{1}{2}\cdot (1-\Pr\left[ \mathcal{A}(g^x,g^y,g^z)=1 \right]) =21⋅Pr[A(gx,gy,gxy)=1]+21⋅(1−Pr[A(gx,gy,gz)=1])
- = 1 2 + 1 2 ⋅ ( Pr [ A ( g x , g y , g x y ) = 1 ] − Pr [ A ( g x , g y , g z ) = 1 ] ) = \frac{1}{2} + \frac{1}{2}\cdot \left( \Pr\left[ \mathcal{A}(g^x,g^y,g^{xy})=1 \right] - \Pr\left[ \mathcal{A}(g^x,g^y,g^z)=1 \right] \right) =21+21⋅(Pr[A(gx,gy,gxy)=1]−Pr[A(gx,gy,gz)=1])
- ≤ 1 2 + 1 2 ⋅ n e g l ( n ) \le \frac{1}{2} + \frac{1}{2}\cdot \mathsf{negl}(n) %\left| \Pr\left[ \mathcal{A}(g^x,g^y,g^{xy})=1 \right] - \Pr\left[ \mathcal{A}(g^x,g^y,g^z)=1 \right] \right| ≤21+21⋅negl(n)
-
DHKE例子
- G = Z 11 ∗ \mathbb{G} = \mathbb{Z}^*_{11} G=Z11∗ ;二次剩余循环群的阶 q = ? q = ? q=?
- 二次剩余子群 ?
- g = 3 g = 3 g=3 是生成元吗?
- 如果 x = 3 x = 3 x=3 且 y = 4 y = 4 y=4,Bob发给Alice消息是?
- Alice 如何计算密钥?
- Bob 如何计算密钥?
-
三方密钥交换
- DH基于的KE在2轮实现三方密钥交换,Key = g a b c =g^{abc} =gabc。
- Joux’s KE 在 1 轮实现三方密钥交换。在 bilinear map中,Key = e ( P , P ) a b c =e(P,P)^{abc} =e(P,P)abc 。
- 开放问题:如何在一轮中在4方之间交换密钥?
-
完美保密私钥加密引理
- 引理: G \mathbb{G} G 是有限群并且 m ∈ G m\in \mathbb{G} m∈G 是任意元素。那么选择随机 k ← G k \gets \mathbb{G} k←G 并令 c : = m ⋅ k c := m\cdot k c:=m⋅k ,将得到与随机选择的 c ← G c \gets \mathbb{G} c←G 相同的分布,即 ∀ g ∈ G \forall g \in \mathbb{G} ∀g∈G: $ \Pr[m\cdot k = g] = 1/|\mathbb{G}| $。
- 证明: g ∈ G g \in \mathbb{G} g∈G 是任意的,那么 $\Pr[m\cdot k = g] = \Pr[k = m^{-1}\cdot g] $。由于 k k k 均匀随机选择,选择 k k k 的概率与一个固定元素 m − 1 ⋅ g m^{-1}\cdot g m−1⋅g 相同,都是 1 / ∣ G 1/|\mathbb{G} 1/∣G|。
- 注:这是一种完美保密的私钥加密方案,将一个元素(明文)与另一个元素(密钥)的运算得到第三个元素(密文),与之前一个字母的移位密码是完美保密是类似的。
-
Elgamal加密方案
- 一个算法 G \mathcal{G} G, 输入 1 n 1^n 1n, 输出一个循环群 G \mathbb{G} G, 其阶为 q q q ( ∥ q ∥ = n \|q\| = n ∥q∥=n), 并且生成元为 g g g。
- 构造:
- G e n \mathsf{Gen} Gen: 运行 G ( 1 n ) \mathcal{G}(1^n) G(1n) 来产生 ( G , q , g ) (\mathbb{G},q,g) (G,q,g)。一个随机的 x ← Z q x \gets \mathbb{Z}_q x←Zq 和 h : = g x h := g^x h:=gx。 p k = ⟨ G , q , g , h ⟩ pk = \langle \mathbb{G},q,g,h \rangle pk=⟨G,q,g,h⟩ 并且 s k = ⟨ G , q , g , x ⟩ sk = \langle \mathbb{G},q,g,x \rangle sk=⟨G,q,g,x⟩。
- E n c \mathsf{Enc} Enc: 一个随机 y ← Z q y \gets \mathbb{Z}_q y←Zq 并且输入 ⟨ c 1 , c 2 ⟩ = ⟨ g y , h y ⋅ m ⟩ \langle c_1, c_2 \rangle = \langle g^y, h^y\cdot m\rangle ⟨c1,c2⟩=⟨gy,hy⋅m⟩。
- D e c \mathsf{Dec} Dec: m : = c 2 / c 1 x m:=c_2/c_1^x m:=c2/c1x。
- 定理:如果DDH问题与 G \mathcal{G} G相关是难的,那么Elgamal加密方案是CPA安全。
-
Elgamal加密例子
- 加密前首先对明文进行二进制串编码:
- 在模一个强质数 p = ( 2 q + 1 ) p = (2q+1) p=(2q+1) 的二次剩余子群中,
- 一个串 m ^ ∈ { 0 , 1 } n − 1 \hat{m} \in \{0,1\}^{n-1} m^∈{0,1}n−1, n = ∥ q ∥ n = \|q\| n=∥q∥。
- 将
m
^
\hat{m}
m^ 映射到被加密的明文
m
=
[
(
m
^
+
1
)
2
m
o
d
p
]
m = [(\hat{m}+1)^2 \bmod p]
m=[(m^+1)2modp]。
- 这里的加1是为了保证在消息为“0”时,明文也在这个乘法群里
- 映射是一对一且可逆的。
- 例子,略。
- 加密前首先对明文进行二进制串编码:
-
证明
- 思路:通过将DDH问题的算法 D D D规约到窃听者算法 A \mathcal{A} A来证明 Π \Pi Π 在窃听者出现时是安全的。
- 将 Π \Pi Π 改造为 Π ~ \tilde{\Pi} Π~: 加密是通过随机选择的 y ← Z q y \gets \mathbb{Z}_q y←Zq 和 z ← Z q z \gets \mathbb{Z}_q z←Zq 然后输出密文: ⟨ g y , g z ⋅ m ⟩ \langle g^y, g^z\cdot m\rangle ⟨gy,gz⋅m⟩。
- Π ~ \tilde{\Pi} Π~ 不是一个加密方案.
- g y g^y gy 独立于 m m m。
- g z ⋅ m g^z\cdot m gz⋅m 是独立于 m m m 的随机元素 (之前的私钥加密引理)。
- 实验成功概率与完美保密加密方案中是相同的。 Pr [ P u b K A , Π ~ e a v ( n ) = 1 ] = 1 2 . \Pr\left[\mathsf{PubK}^{\mathsf{eav}}_{\mathcal{A},\tilde{\Pi}}(n)=1\right] = \frac{1}{2}. Pr[PubKA,Π~eav(n)=1]=21.
-
证明(续一)
- 将DDH问题的算法 D D D规约到窃听者算法 A \mathcal{A} A。
-
证明(续二)
-
情况1: g 3 = g z g_3 = g^z g3=gz, 密文是 ⟨ g y , g z ⋅ m b ⟩ \langle g^y, g^z\cdot m_b\rangle ⟨gy,gz⋅mb⟩.
$ \Pr[D(gx,gy,g^z)=1] = \Pr\left[\mathsf{PubK}^{\mathsf{eav}}_{\mathcal{A},\tilde{\Pi}}(n)=1\right] = \frac{1}{2}. $
-
情况2: g 3 = g x y g_3 = g^{xy} g3=gxy, 密文是 ⟨ g y , g x y ⋅ m b ⟩ \langle g^y, g^{xy}\cdot m_b\rangle ⟨gy,gxy⋅mb⟩.
$ \Pr[D(gx,gy,g^{xy})=1] = \Pr\left[\mathsf{PubK}^{\mathsf{eav}}_{\mathcal{A},\Pi}(n)=1\right] = \varepsilon(n). $
-
由于DDH问题是难的,
n e g l ( n ) ≥ ∣ Pr [ D ( g x , g y , g z ) = 1 ] − Pr [ D ( g x , g y , g x y ) = 1 ] ∣ = ∣ 1 2 − ε ( n ) ∣ . \mathsf{negl}(n) \ge |\Pr[D(g^x,g^y,g^z)=1] - \Pr[D(g^x,g^y,g^{xy})=1]| =|\frac{1}{2}-\varepsilon(n)|. negl(n)≥∣Pr[D(gx,gy,gz)=1]−Pr[D(gx,gy,gxy)=1]∣=∣21−ε(n)∣.
-
-
Elgamal加密中CCA
- Elgamal不是CCA安全的。
- 例题:构造明文
m
⋅
m
′
m\cdot m'
m⋅m′ 的密文。
- 给定 p k = ⟨ g , h ⟩ pk=\langle g, h\rangle pk=⟨g,h⟩, c = ⟨ c 1 , c 2 ⟩ c = \langle c_1, c_2\rangle c=⟨c1,c2⟩, c 1 = g y c_1=g^y c1=gy, c 2 = h y ⋅ m c_2=h^y\cdot m c2=hy⋅m,
- 方法1:计算 c 2 ′ : = c 2 ⋅ m ′ c_2' := c_2\cdot m' c2′:=c2⋅m′, 和 c ′ = ⟨ c 1 , c 2 ′ ⟩ c' = \langle c_1, c_2'\rangle c′=⟨c1,c2′⟩. $ \frac{c_2’}{c_1^x} = ? $
- 方法2:计算
c
1
′
′
:
=
c
1
⋅
g
y
′
′
c_1'' := c_1\cdot g^{y''}
c1′′:=c1⋅gy′′, 和
c
2
′
′
:
=
c
2
⋅
h
y
′
′
⋅
m
′
c_2'' := c_2\cdot h^{y''}\cdot m'
c2′′:=c2⋅hy′′⋅m′。
- $ c_1’’=g^y\cdot g^{y’’} = g^{y+y’’};\text{and}; c_2’’= ? $
- 所以 c ′ ′ = ⟨ c 1 ′ ′ , c 2 ′ ′ ⟩ c''=\langle c_1'',c_2''\rangle c′′=⟨c1′′,c2′′⟩ 是 m ⋅ m ′ m\cdot m' m⋅m′ 的密文。
-
Elgamal实现问题
- 共享公开参数:
G
\mathcal{G}
G 产生参数
G
,
q
,
g
\mathbb{G},q,g
G,q,g。
- 这些参数可以只产生一次并且为所有人所使用(’‘once-and-for-all’’)。
- 可以被多个接收者使用。
- 每个接收者必须选择各自的保密数值 x x x 并且发布他们自己的公钥包含 h = g x h=g^x h=gx。
- 参数共享:在 Elgamal 的情况下,公开参数可以被共享。在 RSA 情况下,参数可以被共享吗?
- 共享公开参数:
G
\mathcal{G}
G 产生参数
G
,
q
,
g
\mathbb{G},q,g
G,q,g。
-
椭圆曲线密码学
- 在椭圆曲线群上构造的离散对数问题
- 其他密码学上的应用在1985年被提出
- 类比离散对数,DH密钥交换,ElGamal加密和DSA,在椭圆曲线上有,ECDL,ECDHKE,ElGamal ECC,ECDSA
- 比自然数域上更有效,密钥长度是所需蛮力搜索指数长度的二倍。
- 二倍的原因是,离散对数问题的蛮力搜索所需指数长度是群阶指数长度的一半
-
椭圆曲线群
- 椭圆曲线群是在一个有限域中的一个平面代数曲线上的点之间“加法”操作
- 在有限域中取模是关键,单位元是无穷远点
-
在椭圆曲线点上做加法构成循环群
- 每条直线和曲线有三个交点
- 一条直线与曲线的切点算2次
- 垂直线上,无穷远点计做一个点
- 点上的加法
- 三点成一线,三点之和为无穷远点
- 密钥生成
- 私钥是 d d d,公钥为 d P dP dP
- 每条直线和曲线有三个交点
-
ECDHKE的一个例子
- 计算ECDHKE的密钥,这里枚举了生成元为(3,4)的所有指数结果
- Alice的密钥为 a = 4 a = 4 a=4,收到(2,7)
- Alice密钥计算是从(2,7)开始,向后数3个点(乘4=加3次)
- Bob密钥计算是从(4,10)开始(因为 a = 4 a=4 a=4),向后数2个点(因为 b = 3 b=3 b=3)
-
实践中的椭圆曲线密码系统
- P256有一定风险,被揭露有NSA的后门;
- Curve25519更安全高效,其中常数选择有充分的解释;
-
总结
- DHKE,ElGamal加密来自于CDH,DDH问题,后者来自于在指数阶群上的离散对数问题
- 椭圆曲线密码学更有效并且被广泛使用