目录
3.6 实际操作和加密方式
3.6.1 流密码
CONSTRUCTION 3.30 使用伪随机函数构造流密码
3.6.2 流密码的同步模式
CONSTRUCTION 3.31 流密码的异步模式
3.6 实际操作和加密方式
现代密码学导论-14-基于伪随机发生器的EAV安全_南鸢北折的博客-CSDN博客
CONSTRUCTION 3.17 一种基于伪随机发生器的私钥加密方案
现代密码学导论-19-基于伪随机函数的CPA安全_南鸢北折的博客-CSDN博客
CONSTRUCTION 3.28 构造基于伪随机函数的CPA安全的加密方案
以上两种方案有一些缺点,使得它们不适合在现实中应用
其中,方案3.17只是EAV安全的,不能抵御选择明文攻击。此外,这两种方案都只定义用于对固定长度的消息进行加密。
以下这里所讨论的操作模式即在使用流密码或者块密码加密长的明文时所采用的加密流程
3.6.1 流密码
现代密码学导论-12-伪随机发生器_南鸢北折的博客-CSDN博客
上文中的 DEFINITION 3.14 伪随机发生器的定义,我们从中不难看出
伪随机发生器G是相当不灵活的,因为它的输出长度是固定的。具体来讲,我们假设G的膨胀系数是l,对于一个长度为l’>l的消息,我们就不能简单地使用单个n位长度的密钥对该消息进行加密。对于一个长度为l’<l的消息,使用G加密后的输出是l位,虽然我们可以通过截取其前l’位得到密文,但是这样做相当于有长度为l-l’的伪随机序列没有起到任何作用就被白白丢弃掉了,这样做是一种浪费。
形式上,流密码是一对确定性算法(Init,Next),其中:
- Init将一个种子s和一个可选的初始化向量IV作为输入,并输出一些初始状态st。
- Next将当前状态st作为输入,并输出一个比特y,以及更新状态为st’
(当然,在现实中,Next可能输出一个字节甚至更多的随机位,而不是一次输出单个位。为了简单起见,我们假设它每次被调用时只输出一位)
从某个初始状态st0开始,我们可以通过多次重复调用Next来生成任何所需的位数。
我们定义了一个GetBits算法,以初始状态st0和一个期望长度1^l作为输入,然后:
对于i,从1一直到l,计算
返回长度为l的比特串和最终状态st_l。其中返回的比特串为
GetBits算法的输出有两个,第一个是长度为l的比特串,第二个是最终状态
我们规定GetBits_1表示运行GetBits并只返回其第一个输出,即长度为l的比特串的输出
CONSTRUCTION 3.30 使用伪随机函数构造流密码
设F是一个伪随机函数。定义流密码(Init,Next),其中Init接受一个3n/4位的初始化向量,Next在每个调用中输出n位:
Init:输入为s∈{0,1}^n和IV∈{0,1}^(3n/4),输出st =(s, IV, 0)。
Next: 输入为st = (s, IV, i),输出y := Fs(IV‖<i>),并更新状态为st’ = (s, IV, i+1)
3.6.2 流密码的同步模式
流密码的操作模式有两种:同步模式和异步模式
同步模式。假设发送方S到接收方R已经共享了密钥k,会话过程如下:
双方都调用Init (k)来获得相同的初始状态st0。
设st_S为S的当前状态,如果S想加密一个消息m,S就计算
S将密文c := m⊕y发送给接收方R,并更新自身状态为st’_S
设st_R为R的当前状态,当R从发送方接收到一个密文c时,计算
得到消息m := c⊕y,并将自身状态更新为st’_R
请注意,对于同步模式,流密码不需要使用初始化向量IV。没有密文扩展,因为从发送方到接收方的总通信长度完全等于被加密的消息的总长度。
CONSTRUCTION 3.31 流密码的异步模式
设(Init,Next)为一个接受n位IV的流密码,为任意长度的消息定义一个私钥加密方案,如下所述:
Gen:输入为1^n。随机均匀选择一个k∈{0,1}^n并输出
Enc:输入为k∈{0,1}^n和一个消息m∈{0,1}∗,随机均匀选择一个初始化向量IV∈{0, 1}^n,计算并输出密文
Dec:输入为k∈{0,1}^n和密文<IV,c>,得到消息m