实际序列密码

关于实际序列密码

处理实际序列密码的方法就是,用伪随机数生成器替换真随机密钥序列位,其中密钥k作为种子。

实际序列密码的原理为:在这里插入图片描述

而实际序列密码并不是无条件安全的,实际上所以实际加密算法(序列密码、分组密码、公钥算法)都不是无条件安全的。

我们能期待的最好结果就是计算安全。

计算安全

定义:
如果为破解一个密码体制,最好的已知算法需要至少t个操作,则说明次密码体制是计算安全的。

这个定义看起来合理,但仍然存在很多问题,首先,人们通常不知道对于给定的攻击而言,最好的算法是哪一个。例如RSA公钥,可以通过因式分解大整数破解。尽管很多因式分解算法都是已知的,但我们不知道是否存在更好的攻击方法。

实际中可行的最好方法就是设计一个加密方案,并假设它是计算安全的。对于对称密码而言,这通常意味着希望穷尽密钥搜索是最好的攻击方法。

这个实际模仿了一次一密。优于OTP的地方在于,它只需要交换一次密钥 ,并且该密钥对长度不超过100位,而且不用与明文等长。

关于密钥序列

关于Alice与Bob生成的密钥序列s0,s1,…我们需要不同类型的随机数生成器生成密码序列。

我们不能使用TRNG,因为根据定义Alice和Bob不可能生成一样的密钥序列。相反我们需要确定的数字生成器,即伪随机数。

两种生成器:

  1. 利用PRNG构建密码流

下面这个想法看上去很有希望(实际没啥用),许多PRNG都具有良好的统计属性,这对强壮的序列密码而言是非常必要的。如果我们对密码流序列进行统计检测,其输出结果的行为表现应该与抛硬币类似。

因此,自然而然假设,PRNG可以用来生成密码流,但是,所有这些对序列密码而言都不足够,因为攻击者Oscar也很聪明。

考虑以下这种攻击方式:

假设一个基于线性同余发生器的PRNG:
S0=seed
Si+1≡A Si+B mod m,i=0,1,…

其中m为100位长,Si,A,B∈{0,1,…,m-1}。
如果我们仔细选择这些参数,此PRNG将会拥有良好的统计属性。
模数m是加密的一部分,而且是公开的。
密钥包含值(A,B),也可能包含种子S0,并且每个值的长度均为100位。则总密钥长度为200位,此长度已经足够抵御蛮力攻击。

由于这是一个序列密码,Alice可以通过yi≡xi+si mod 2来获得。

假设Oscar已知明文的钱300位(例如头文件),或者他猜出了部分明文。

由于他知道密文,所以他现在可以利用si≡yi+xi mod m,i=0,1, … ,300来计算密钥序列前300位,S1={s1,s2, … ,s100},S2={s101, … ,s200},S3={S201, … ,s300},RNG前三个输出符号。

现在Oscar有两个等式:S2≡A S0+B mod m;S3≡A S2+B mod m。

解得:A≡(S2-S3)/(S1-S2) mod m
B≡S2-S1(S2-S3)/(S1-S2) mod m

在gcd((S1-S2),m)≠1的情况下,可以得到多个解。而如果已知明文第四片信息的话,就可以唯一确定密钥。

因此,概括地讲,如果已知一些明文片段,我们就可以计算出密钥,并解密整个密文。

  1. 利用CSPRNG构建密钥序列

为了抵抗上述攻击,我们可以使用CSPRNG,因为它可以确保密钥序列是不可预测的。

密钥流不可预测意味着,给定密钥对前n位输出位,不可能计算出后面的位。

而相当一部分伪随机数生成器都不是密码学安全的。因此,实际中我们需要使用专门设计的伪随机数生成器来生成序列密码。

实际中的序列密码大致可以分为两种:针对软件实现优化的密码和针对硬件实现优化的密码。第三种序列密码,是将分组密码作为基本块来实现的。

目前,科学家设计更安全的分组密码看上去比序列密码要更容易一些。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值