哈希函数与随机数

约 3 分钟 #信息安全
杨秋逸
杨秋逸

上课笔记

哈希函数和随机数

哈希函数

长度

md5 32个字符长度 sha1 128 个字符长度 (常用)

要求:明文小改,hash大变

设计

迭代
  1. 消息填充为512倍数(最后几位是 消息长度mod 512)
  2. 等分
  3. 迭代

第一代 sha1 第二代 sha256 sha512 第三代 keccak

随机数

性质

  1. 随机性————不存在统计学偏差,完全杂乱的序列(弱随机)线性同余法可以生成
  2. 不可预测性———不能从过去的数列推测出下一个出现的数(强伪随机)
  3. 不可重现性———除非保存序列本身,否则不能重现相同序列(真随机)

1,2 是伪随机数,但是具有“图灵不可区分”,也就是以假乱真

满足下面的一定满足下面的,满足上面的不一定满足下面的

生成器

软件不可生成真随机数,必须有硬件参与(内部状态相同,所以可以产生相同随机数列) 而且软件生成的随机数在某一时刻必然重复,此为周期

可用鼠标位置,键盘输入间隔,热噪声产生不可重现的随机数(真随机数)

伪随机数生成器

种子 ->(内部状态=有限自动机=一种算法)伪随机数生成器 -> 伪随机数列 同一个种子(key),产生的随机数相同

线性同余法

Ri+1=(ARi+C)modMR_{i+1}=(A*R_{i}+C) mod M 假设A=3,C=0,M=7,种子等于6,结果: 4 5 1 3 2 6 4 5 1 3 2 6... 周期为6 谨慎选择A,C,M可以产生具有随机性的数列

java和C库都是线性同余法

算法公开,种子保密,知道上一个,就算得出下一个

单向hash函数法

Ri+1=hash(Ri+Date)R_{i+1}=hash(R_i+Date)

密码法
ANSI X9.17 (美国的标准)
梅森算法
java
  1. Java.util.random
  2. Java.security.Secure.Random

攻击

攻击随机数使用环境

随机数池

随机数不是使用时产生的,提前产生放在池中,所以呀,要保护随机数池,一般也会选择攻击随机数池

标准

随机性能监测
  1. 《中华人民共和国密码行业标准》
  2. NIST SP800-22(2010-04)
    • Tips:网上有软件
  3. 民政部关于随机数的标准
    • MZ/T 093-2017 中国福利彩票系统彩票随机数检验规范