Chapter 5 伪随机数生成器(Pseudorandom Generator)
文章目录
引入:
之前介绍过一次性密码本这种安全的密码算法,但是它要求密钥、明文长度相同。现在我们希望密钥可以比明文短,如果依然采用一次性密码本的方法(异或),需要密钥 k k k经过一个函数 G G G后与明文长度相同。显然对于安全性而言,这样的方案是不具备一次性密码本那样的均匀密文(安全性定义2.5),因为 G G G输入的长度小于输出的长度,因此它的输出结果不是均匀分布的。但是结合上一章提到的不可区分(indistinguishable)的思想,依然希望它能够做到一个近似均匀(随机)采样。具有这样性质的 G G G变便是随机数生成器。
一、相关定义
1、PRG
伪随机数生成器(Pseudorandom Generator,PRG)是一个不含随机性的函数 G G G,它具有如下特点:一是输出的长度大于输入的长度;二是输出结果是伪随机数(pseudorandom),即输出的分布和均匀采样是不可区分的(indistinguishable)。下面给出安全的PRG的形式化定义。
定义5.1 对于一个非随机性的函数
G
:
{
0
,
1
}
λ
→
{
0
,
1
}
λ
+
l
(
l
>
0
)
G:\{0,1\}^\lambda\rightarrow\{0,1\}^{\lambda+l}(l>0)
G:{0,1}λ→{0,1}λ+l(l>0),
G
G
G是一个安全的PRG当且仅当如下图定义的两个库不可区分(即
L
p
r
g
−
r
e
a
l
G
≈
~
L
p
r
g
−
r
a
n
d
G
L_{prg-real}^G\widetilde\approx L_{prg-rand}^G
Lprg−realG≈
Lprg−randG):
其中PRG的输入又称为种子(seed),参数 l l l称为stretch。需要注意的是, L p r g − r e a l G L_{prg-real}^G Lprg−realG的定义中PRG的输入是均匀采样,因此上述的安全是在这一前提下才被保证的。
一个类似的概念是随机数生成(Random Number Generation,RNG),它们的输入通常来自硬件设备。这与PRG不同:PRG的任务在于拓展随机数,RNG的任务在于把输入变成均匀采样的输出。
值得一提的是,目前并没有安全PRG实例(如果有,将解决P vs NP问题)。因此本书接下来介绍的PRG都是目前较为认可为安全的PRG。
2、计算安全性定义
结合上一章的计算安全性,这里给出计算安全性的定义。这个定义与定义2.6十分类似,就是把库的等价改为了不可区分。
定义5.2 密码算法 Σ \Sigma Σ有一次性计算安全性(computational one-time secrecy),当且仅当如下定义的两个库不可区分,即 L o t s − L Σ ≈ ~ L o t s − R Σ L_{ots-L}^{\Sigma}\widetilde\approx L_{ots-R}^{\Sigma} Lots−LΣ≈ Lots−RΣ:
我们曾证明一次性密码本具有定义2.6的一次性安全性,那么如果将在一次性密码本中加入PRG(如下图所示),那么这样的密码算法(Pseudo-OTP)是否具备定义5.2的一次性计算安全性呢?
事实上,这里有如下结论:
定理5.1 对于如上图定义的密码算法Pseudo-OTP,如果其使用的PRG是安全的(也就是满足定义5.1的要求),那么Pseudo-OTP也具备一次性计算安全性(定义5.2)。
上述定理的证明也是使用Hybrid方法构建中间库以逐步转化为目标库,其中较为关键的是PRG安全性以及OTP(一次性密码本)安全性的使用。思路就是先把利用PRG的安全性将 G ( k ) G(k) G(k)转成均匀采样,然后就可以利用一次性密码本的安全性把 m L m_L mL换成 m R m_R mR,最后在此利用PRG的安全性把形式换回来。具体证明过程就省略了。
二、拓展PRG的stretch
PRG的任务就是把较短的
k
e
y
key
key推展成更长的随机数。假设已经有一个安全的length-doubling PRG(输入长度是
λ
\lambda
λ,输出的长度为
2
λ
2\lambda
2λ),将如何得到输出长度更长的方案?下面给出一种拓展方法:
下面将证明这种方案的安全性。首先步骤1-2是利用PRG的安全性,
将
x
、
y
x、y
x、y转成了均匀采样(
x
∣
∣
y
x||y
x∣∣y整体是均匀采样,那么每个部分也是,可以理解为对于均匀采样时每一位是0/1的概率都是一样的;后面第8步也可以这样理解) 。然后
u
、
v
u、v
u、v的转换也类似(注意,这里是在
y
y
y是均匀采样的前提下才可以用PRG的安全性的)。因此算法
H
1
H_1
H1与均匀采样不可区分,具备安全性。
书在本章的时候其实还举出了另一种方案:返回 x ∣ ∣ y ∣ ∣ u ∣ ∣ v x||y||u||v x∣∣y∣∣u∣∣v,但是这是不安全的。因为根据Kerckhoffs原则,攻击者可以知道 G G G的具体算法,因此对于一个返回 G ( y ) = ? u ∣ ∣ v G(y)\overset?=u||v G(y)=?u∣∣v的程序,真实算法与均匀采样的输出结果概率不是negligible的,因此不满足一次性计算安全性。不过书中此部分更多的是在强调注意在使用Hybrid方法时每一步的转换都需要注意细节,以及对已知安全库的使用方法的不同可能将破坏安全性。
在上述证明的基础上,可以根据类似的方法,构造出输出更长的PRG:
定理5.2 如果 G G G是一个安全的length-doubling PRG,那么 H n H_n Hn也是一个安全的PRG( s t r e t c h = n λ stretch=n\lambda stretch=nλ):
三、流密码和symmetric ratchet
这一节是对上一节的方案特点的一些应用的探讨
1、流密码(stream cipher)
根据定理5.2,可以构造输出长度为无限长的安全PRG。下面引入一种常见密码——流密码的概念。
流密码是一种密码学算法,是根据一个种子产生密钥流(伪随机数),把密钥流与明文加密(异或)。不过书上的定义似乎更多的是指产生密钥流的部分。
定义5.3 流密码(stream cipher)是一个算法 G G G,其输入参数是种子 s s s和stretch l l l,输出是一个字符串,且满足:
- G ( s , l ) G(s,l) G(s,l)是一个长度为 l l l的字符串
- 如果 i < j i<j i<j,那么 G ( s , i ) G(s,i) G(s,i)是 G ( s , j ) G(s,j) G(s,j)的前缀
- 对于任意 n n n, G ( . , n ) G(.,n) G(.,n)是一个安全PRG
定理5.2中的算法可以是流密码的一种实现方式。
2、symmetric ratchet
假设一直用同一个对称密钥 k k k进行多次加密,那么一旦攻击者获取了 k k k,那么之前以及未来的信息都有可能被破解。受到流密码的启发,可以用密钥 k k k产生密钥流,把密钥流的第 i i i段( t i t_i ti)作为第 i i i次加密的密钥,从而实现密钥的更新。不过保留 t i t_i ti会泄露之前的信息,因此需要进行彻底删除。这样一种不断产生密钥用于加密的方法称为symmetric ratchet,其具体定义如下图所示:
实际上,如果得知某一个 s i s_i si,根据Kerckhoffs原则,可以利用 G G G计算出后续的每一个密钥 t i + 1 , t i + 2 . . . t_{i+1},t_{i+2}... ti+1,ti+2...。但是可以保证得知 s i s_i si并不会泄露之前的 t 1 , . . . t i t_1,...t_{i} t1,...ti。这样一种安全性称为前向安全性(forward secrecy)。而且ratchet意为棘轮,也就是只能往一个方向,说的正是前向安全性这一特点。
定理5.3 如果如图定义的symmetric ratchet中 G G G是一个安全PRG,且加密算法的密钥( Σ . K \Sigma.K Σ.K)要求是均匀采样,那么即使攻击者获得了 s n s_n sn,该symmetric ratchet产生的前 n n n个密文是伪随机数(也就是不会泄露任何信息)。
这个定理的证明大致思路如下:对于攻击者而言,整个加密算法如下图所示。而标灰色的这块根据定理5.2可以明白是安全的,也就是
t
1
,
.
.
.
t
n
t_1,...t_n
t1,...tn以及
s
n
s_n
sn均可以视为伪随机数。那么对于安全的加密算法(其输入要求是密钥均匀采样,输入的伪随机数
t
i
t_i
ti正好满足),其加密所得的密文
c
i
c_i
ci也是安全的(等价于在密文空间均匀采样)。因此得知
s
n
s_n
sn并不会导致之前密文泄露信息。