【Joy of Cryptography 读书笔记】Chapter 5 伪随机数生成器(Pseudorandom Generator)

本文介绍了伪随机数生成器(PRG)的概念,包括其定义、安全性以及如何通过PRG拓展密钥长度。PRG在流密码和symmetric ratchet中的应用被讨论,前者用于生成无限长的密钥流,后者确保即使密钥泄露,也能保持前向安全性。文中还阐述了PRG在密码算法中的重要性和安全性证明方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 LprgrealG LprgrandG):

其中PRG的输入又称为种子(seed),参数 l l l称为stretch。需要注意的是, L p r g − r e a l G L_{prg-real}^G LprgrealG的定义中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} LotsLΣ LotsRΣ:

我们曾证明一次性密码本具有定义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 xy转成了均匀采样( x ∣ ∣ y x||y x∣∣y整体是均匀采样,那么每个部分也是,可以理解为对于均匀采样时每一位是0/1的概率都是一样的;后面第8步也可以这样理解) 。然后 u 、 v u、v uv的转换也类似(注意,这里是在 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=):

三、流密码和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并不会导致之前密文泄露信息。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值