本文包括:随机数的性质,具体的伪随机数发生器,攻击思路。
伪随机数发生器包括:线性同余法,BBS,分组密码形式,ANIS X.917,单项散列函数,密码法。
尝试新编辑格式!
.
性质
随机性
- 可伸缩性:任何子序列都符合随机性
- 统计分布均匀:0 1 分布很好地保持在各占50%。
- 独立性:任何子序列不能通过其他子序列推导出来。
- 一致性:输入任何种子都符合随机性
不可预测性
在攻击者知道过去的伪随机数列的情况下,仍然无法预测下一个伪随机数。
- 向后不可预测性
- 向前不可预测性
不可重现性
真随机数(如白噪声,热辐射,分子无规律运动 等)。
投骰子是真随机数。
伪随机数发生器——PRNG
- 伪随机比特流:生产不限长的位流,应用于流密码。
- 伪随机函数(PRF):生产固定长度的位串,每轮输入包括种子+上下文。应用于对称密码 等等。
二者除了位的数量之外,并无区别
真随机数发生器——TRNG
.
.
具体的伪随机数发生器
1.线性同余法
m:模 , a:乘数 , c:增量 , X0:种子
Xn+1 =(aXn+c)mod m
特点:
只有随机性,不具备不可预测性,不能用于密码技术
很多伪随机数库都是用线性同余法编写的,如C语言的rand,JAVA的java.util.Random类等,这些都不能用于密码技术
三个标准:
1.全周期,即 t=m-1
2.越随机越好
3.可以在32位运算器方便运算
常用:
取c=0;m=231-1.
Xn+1 =(aXn)mod(231-1)
虽然a的取值有很多很多,但其实满足3个标准的并不多。
攻击:
1.如果其他人知道了参数a,c,m,那么它只需知道一个随机数,就可以推得后续所有数列
2.如果仅知道是线性同余法,那么只需知道连续4个随机数,也可以推得后续数列
改进:
1.每隔N个数,就重新输入种子(比如对时钟取模作为种子)
2.增加一步,将随机数加时钟值再取模
.
.
2.BBS发生器
算法:
选择两个大素数p, q, 满足 p ≡ q ≡ 3(mod 4)
设n=pq, 找一个随机数s, s和n互素,即gcd(s,n)=1
令 X0 = s2 mod nfor i=1 to ∞
Xi = (Xi-1)2mod n
Bi = Xi mod 2S叫种子
特点:
随机性+不可预测性
性能很好!
贴个例子(抄来的):(n=383*503,s=101355)
.
3.分组密码形式
利用OFB和CTR模式思想的伪随机数发生器。
不同点:
CTR模式:每次V++
OFB模式:本轮输出作为下轮的V
相同点:
种子 = K + V
(对于ASE的话,种子 = 128bit密钥 + 128bit的V)
.
.
4. ANIS X.917
史上最强?
- 应用在金融和PGP等。
构成:
输入:64位的时间值 + 64位种子(任意初始值)(二者都必需不断更新)
密钥:三个3DES模块,用同一个56bit密钥
输出:64位随机数 + 64位种子
过程: 图背下来
(其中EDE([K1,K2],X)代表两个密钥的3DES。)
加密钥(图):
思路:
用三次3DES保证了随机数
即使他人知道了输出RI,也无法推出其他参数。
换句话说:密钥保护了内部状态。
.
5. 单项散列函数
具备 随机性 + 不可预测性
散列的单向性是不可预测性的保障。
.
6. 密码法
思路同于单项散列函数。
密钥是不可预测性的保障。
.
.
.
攻击思路
- 对种子攻击
一般 种子 由真随机数发生器生成。
- 对随机数池攻击
真随机数一般不会等使用时才当场生成,
而是提前生成一些,储备在名为随机数池的文件中。
如果随机数池遭到攻击,那么伪随机数都可能被预测,
虽然随机数池的数据并没有实际意义,但是我们却必须保护它。
.
.
.
.
.
.
.