秋逸

上课笔记

哈希函数和随机数

哈希函数

长度

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 中国福利彩票系统彩票随机数检验规范
哈希函数与随机数
: 杨秋逸
https://yangqiuyi.com/blog/算法/哈希函数与随机数/
© 2025 杨秋逸 . All rights reserved.