随机数发生器设计(二)

一、软件随机数发生器组成概述

密码产品应至少包含一个随机比特生成器。
软件随机数发生器应遵循GM/T 0105-2021《软件随机数发生器设计指南》要求,使用SM3或SM4算法作为生成随机比特算法。

本文以SM3算法为例描述软件随机数发生器的一个设计实例。需要注意的是,本实例仅为参考,实际熵源信息、熵估计方法和算法等都可根据需要变动。

软件随机数发生器采集当前运行环境的传感器信息作为熵源,包括当前时间、CPU信息、RAM信息、磁盘信息、网络信息。以上熵源信息经健康测试和熵评估后,作为熵数据输入到熵池。熵数据填满熵池后,可以经扩展函数处理后输入DRNG。扩展函数处理后的熵数据可以反馈到熵池。

DRNG根据熵输入数据和内部状态生成输出随机数,并维护自身种子信息和正确性。初始化函数获取扩展函数的输出和外部输入的nonce更新内部状态。当重播种计数器或时间间隔达到阈值时,产品会执行重播种函数更新内部状态。输出函数可以按照接口要求输出指定长度的随机数。DRNG实现已知答案自测试,在产品上电初始化或有自测试需求时执行。
软件随机数发生器框架

二、熵源

软件随机数发生器采用系统信息作为熵源,包括当前时间、CPU信息、RAM信息、磁盘信息、网络信息。熵源信息如下表所示。
熵源信息
在熵池存在空闲空间时,产品获取熵源信息,经连续健康测试后写入熵池。每次采集的熵源信息RAW_ENTROPY =时间信息|| CPU信息||RAM信息||磁盘信息||网络信息,熵值约29.84比特。熵池为512字节大小。

当前时间信息随时间自然增长,精确到纳秒,外界很难预测产品获取当前时间的精确时间节点,从而无法预测产品得到的该熵源信息,因此在某一时间节点,时间信息相当于独占熵源;CPU信息、RAM信息、磁盘信息和网络信息都在系统运行过程中随系统业务环境动态变化。例如,外界几乎无法预测CPU中断的到来时间和执行时间。因此,CPU信息、RAM信息、磁盘信息和网络信息在某一时间节点相当于独占熵源。

本软件随机数发生器未采用硬件随机数发生器和系统随机数发生器。

采集熵源信息的代码如下。


#generate raw entropy from system source - time
#return 4 bytes
def RNG_Generate_Raw_Entropy_Source1():
    return (int(time_ns()) & 0xFFFFFFFF).to_bytes(4, byteorder = 'big', signed=False)

#generate raw entropy from system source - cpu
# return 16 bytes
def RNG_Generate_Raw_Entropy_Source2():
    usercputime = (int(psutil.cpu_times().user*1000000) & 0xFFFFFFFF).to_bytes(4, byteorder = 'big', signed=False)
    idlecputime = (int(psutil.cpu_times().idle*1000000) & 0xFFFFFFFF).to_bytes(4, byteorder = 'big', signed=False)
    interruptcputime = (int(psutil.cpu_times().interrupt*1000000) & 0xFFFFFFFF).to_bytes(4, byteorder = 'big', signed=False)
    dpccputime = (int(psutil.cpu_times().dpc*1000000) & 0xFFFFFFFF).to_bytes(4, byteorder = 'big', signed=False)
    return usercputime + idlecputime + interruptcputime + dpccputime
#generate raw entropy from system source - ram
# return 8 bytes
def RNG_Generate_Raw_Entropy_Source3():
    usedvmmem = (int(psutil.virtual_memory().used) & 0xFFFFFFFF).to_bytes(4, byteorder = 'big', signed=False)
    usedswapmem = (int(psutil.swap_memory().used) & 0xFFFFFFFF).to_bytes(4, byteorder = 'big', signed=False)
    
    return usedvmmem + usedswapmem
#generate raw entropy from system source - disk
# return 8 bytes
def RNG_Generate_Raw_Entropy_Source4():
    read_bytes = (int(psutil.disk_io_counters().read_bytes) & 0xFFFF).to_bytes(2, byteorder = 'big', signed=False)
    write_bytes = (int(psutil.disk_io_counters().write_bytes) & 0xFFFF).to_bytes(2, byteorder = 'big', signed=False)
    read_time = (int(psutil.disk_io_counters().read_time) & 0xFFFF).to_bytes(2, byteorder = 'big', signed=False)
    write_time = (int(psutil.disk_io_counters().write_time) & 0xFFFF).to_bytes(2, byteorder = 'big', signed=False)
    return read_bytes + write_bytes + read_time + write_time
#generate raw entropy from system source - network
# return 8 bytes
def RNG_Generate_Raw_Entropy_Source5():
    # print(psutil.net_io_counters())
    bytes_sent = (int(psutil.net_io_counters().bytes_sent) & 0xFFFFFFFF).to_bytes(4, byteorder = 'big', signed=False)
    bytes_recv = (int(psutil.net_io_counters().bytes_recv) & 0xFFFFFFFF).to_bytes(4, byteorder = 'big', signed=False)
    return bytes_sent + bytes_recv

三、熵池

随机数数发生器的熵池大小为512字节。在当前熵估计情况下,512字节大小的熵池具备的熵值可满足大于256比特的要求。
熵池采用SM3_df函数作为扩展函数,流程图如下。
SM3_df
1) 根据输入的返回数据长度(实际为440比特)和输出数据长度256比特计算循环次数。计算循环次数时使用向上取整方式。
2) 对计数器赋初值1,对临时数据赋初值空。
3) 计算SM3(计数器值||返回数据长度||输入熵源数据)。
4) 临时数据更新为临时数据||SM3结果。
5) 计数器增1。
6) 判断循环是否结果,若结束则跳转至第7步,否则跳转至第3步。
7) 取临时数据左侧指定长度数据,返回

8def sm3Hash(hashbytes:bytes):
9)	    temp = sm3_hash([i for i in hashbytes])
10return bytes.fromhex(temp)
1112def SM3_df(input_string, no_of_bits_to_return):
13)	    temp = bytes([])
14len = math.ceil(no_of_bits_to_return/outlen)
15)	    counter = 0x01
16for i in range(len):
17)	        temp = temp + sm3Hash(bytes([counter]) + no_of_bits_to_return.to_bytes(4, 'big') + input_string)
18)	        counter = counter + 1
19return temp[0:int(no_of_bits_to_return/8)]

熵池更新是采用GM/T 0105 附录A所示方式。
熵池
1) 以熵池中第一个字(4字节)为当前字,开始执行遍历。
2) 临时数据temp更新为输入字与当前字异或结果。
3) 临时数据temp依次与某偏移字异或,异或结果更新至临时数据。偏移值分别设定为1、25、51、76、103。
4) 临时数据取低3位作为索引,获取预置表值。。
5) 临时数据右移3位与步骤4预置表值异或。
6) 更新当前值为步骤5结果。
7) 判断是否遍历熵池,若未完成,回到步骤2;否则结束熵池更新。

9#init entropy pool
10def RNG_Init_POOL():
11global entropy_pool
12)	    entropy_pool = []
13for i in range(128):
14)	        entropy_pool.append(bytes([0,0,0,0]))
15#four bytes xor function
16def RNG_Word_XOR(a:bytes, b:bytes):
17return bytes([a[i] ^ b[i] for i in range(4)])
18#word shift function
19def RNG_Word_Shift_Right(a:bytes, len:int):
20return bytes([a[i] >> len for i in range(4)])
21)	table = [0x0, 0x3b6e20c8, 0x76dc4190, 0x4db26158, 0xedb88320, 0xd6d6a3e8, 0x9b64c2b0, 0xa00ae278]
22#add 1 word entropy to entropy pool 
23def RNG_Add_Entropy(entropyWord:bytes):
24global entropy_pool
25global table
26if len(entropy_pool) != 128:
27)	        RNG_Init_POOL()
28for i in range(128):
29)	        temp = RNG_Word_XOR(entropyWord, entropy_pool[i])
30)	        temp = RNG_Word_XOR(temp, entropy_pool[(i+1)%128])
31)	        temp = RNG_Word_XOR(temp, entropy_pool[(i+25)%128])
32)	        temp = RNG_Word_XOR(temp, entropy_pool[(i+51)%128])
33)	        temp = RNG_Word_XOR(temp, entropy_pool[(i+76)%128])
34)	        temp = RNG_Word_XOR(temp, entropy_pool[(i+103)%128])
35)	        temp = RNG_Word_XOR(RNG_Word_Shift_Right(temp, 3), table[temp[3] & 7].to_bytes(4, 'big'))
36)	        entropy_pool[i] = temp 

如果商用密码产品认证中遇到问题,欢迎加微信symmrz或13720098215沟通。

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
随机数作为密钥或密码运算资源被广泛应用于信息安全系统,随机数的研究 越来越重要。随着计算技术密码学的发展,在信息安全应用中不仅需要可输出 各种形式随机数发生器,而且还需要对随机数随机性做更深入的研究与分析, 为相关应用提供理论支撑。 本文综合讨论了随机数发生器随机性检测器的设计与实现。 首先对随机数发生器进行了分类讨论,按照真随机数发生器与伪随机数发生 器两种产生方法及性能进行了分析和对比。本文研究并设计了两款伪随机数发生 器,并用软件实现这两个发生器,产生相应的实例以供随机性检测器测试。同时 在信息安全领域真 随机数发生器中选择了一款常用的噪声源芯片 WNG4 ,用该芯 片产生真随机数,本软件系统调用该真随机数序列作为测试实例,以供随机性检 测器测试。 其次 本文设计并实现了一款随机性检测器,该检测器实现了国内较常用的 15 种检测方法,包括单比特频数检测、块内频数检测、扑克检测、重叠子序列检测、 游程总数检测、游程分布检测、块内最 大 1 游程检测、元推导检测、自相关 检测 、矩阵秩检测、累加和检测、近似熵检测、线性复杂度检测、 Maurer 通用统 计检测、离散傅立叶检测等 15 项检测方法。以统计与概率学为理论依据,对 15 种检测方法进行 软件实现,对每种方法的运算步骤及实现做了详细的研究与分析。 然后 本文使用三个正向实例与一个反向实例作为测试案例对检测器进行测试。 正向实例为本文自行设计随机数发生器产生 的 结果 作 为待测样本数据 即两款 伪随机数发生器与一款真随机数发生器产生的随机数 。 反向实例为模拟一个有明 显缺陷的随机数序列。 本文 详细讨论了测试结果,对随机数发生器随机性检测 器同时进行测试与验证, 以 证明随机数发生器的良好性能及随机性检测器的运行 有效性,并得出结论, 证明 该检测系统的设计与实现与预期一致。 本文的亮点在于: 紧密结合工作实际,紧紧围 绕随机数随机性检测这一课题的研究,系统地梳 理了相关检测方法,综合国内实际情况选择了最适合信息安全领域的 15 种检测方 法,再用简洁高效的软件语言实现这些检测方法,拓展了企业在随机性检测领域 的检测能力,使之成为信息安全 领域 的有效测试工具。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值