随机数发生器设计(三)

news/2024/10/3 18:44:20

随机数发生器设计(三)- 熵估计和健康测试

  • 熵估计
  • 健康测试

熵估计

考虑都熵源的多样性,建立一个通用的熵估计模型比较困难。本文采用nist.sp.800-90B推荐的Markov评估。详见 https://doi.org/10.6028/NIST.SP.800-90B。

执行Markov评估时,熵估计模块会对熵池内部所有数据进行熵估计。Markov评估方式如下图所示。
markov熵估计流程

Markov熵估计流程描述如下:
1、 收集106熵源数据作为熵评估数据。
2、 对熵评估数据统计0和1出现的概率P0和P1。
3、 统计00、01、10和11出现的概率P00、P01、P10和P11。
4、 计算P0,0、P0,1、P1,0和P1,1。其中P0,0= P00/(P00+ P01),P0,1= P01/(P00+ P01),P1,0= P10/(P10+ P11),P1,1= P11/(P10+ P11)。
5、 利用P0,0、P0,1、P1,0和P1,1计算表格对应序列最大的概率pmax。
markov表格
6、 将上表中最大的概率pmax代入min(-log2(pmax)/128,1),结果即为Markov评估最小熵。

def markovEstimate(epsilon:bitarray):N0 = 0N1 = 0N00 = N01 = N10= N11 = 0lastN = 2for i in epsilon:if i == 0:N0 += 1if lastN == 1:N10 += 1elif lastN == 0:N00 += 1else:N1 += 1if lastN == 1:N11 += 1elif lastN == 0:N01 += 1lastN = iP0 = N0/len(epsilon)P1 = 1-P0P00 = N00/(N00 + N01)P01 = N01/(N00 + N01)P10 = N10/(N10 + N11)P11 = N11/(N10 + N11)sequence = [P0*(P00**127), P0*(P01**64)*(P10**63),P0*(P01**1)*(P11**126),P1*(P10**1)*(P00**126),P1*(P10**64)*(P01**63),P1*(P11**127)]#,];pmax = max(sequence)minentropy = min(-math.log2(pmax)/128,1)return minentropy

对时间信息、CPU信息、RAM信息、磁盘信息和网络信息共5个熵源分别连续采集106比特样本,使用Markov评估方式进行熵估计,结果如下表所示。

项目时间信息CPU信息RAM信息磁盘信息网络信息
单次样本长度(字节)416888
采集样本(bit)10000001000000100000010000001000000
熵估计结果0.680.890.410.480.72

采集熵估计样本数据代码如下。

def generateEntropyTestFile():temp = bitarray()tempbytes = bytes()#generate entropy source bits#source 1for i in range(int(10**6/8/4)):tempbytes += RNG_Generate_Raw_Entropy_Source1()temp.frombytes(tempbytes)of = open('./randomsamples/entropysample1.bin','wb')temp.tofile(of)of.close()#source 2tempbytes2 = bytes()temp2 = bitarray()for i in range(int(10**6/8/16)):tempbytes2 += RNG_Generate_Raw_Entropy_Source2()tempbytes2 += bytes(RNG_Generate_Raw_Entropy_Source2()[0:8])temp2.frombytes(tempbytes2)of2 = open('./randomsamples/entropysample2.bin','wb')temp2.tofile(of2)of2.close()#source 3tempbytes3 = bytes()temp3 = bitarray()for i in range(int(10**6/8/8)):tempbytes3 += RNG_Generate_Raw_Entropy_Source3()temp3.frombytes(tempbytes3)of3 = open('./randomsamples/entropysample3.bin','wb')temp3.tofile(of3)of3.close()#source 4temp4 = bitarray()tempbytes4 = bytes()for i in range(int(10**6/8/8)):tempbytes4 += RNG_Generate_Raw_Entropy_Source4()temp4.frombytes(tempbytes4)of4 = open('./randomsamples/entropysample4.bin','wb')temp4.tofile(of4)of4.close()#source 5temp5 = bitarray()tempbytes5 = bytes()for i in range(int(10**6/8/8)):tempbytes5 += RNG_Generate_Raw_Entropy_Source5()temp5.frombytes(tempbytes5)of5 = open('./randomsamples/entropysample5.bin','wb')temp5.tofile(of5)of5.close()return 

健康测试

健康测试包括上电健康测试和连续健康测试。
1)上电健康测试内容:
测试时间:上电健康测试在产品启动时执行。
测试内容:对1024个熵源输出的连续样本进行连续健康测试。
测试方法:重复计数测试
测试样本大小:熵源输出的样本。时间样本为4字节,CPU信息样本为16字节,RAM信息为8字节,磁盘信息为8字节,网络信息8字节。
通过条件:未产生连续11个相同的样本。
处理方法:未通过则返回错误,不能继续使用熵源输出的数据。

    #entropy source poweron health testfor i in range(1024):if RNG_Continuous_Health_Test(RNG_Generate_Raw_Entropy_Source1()) == -1:return 0x80100001for i in range(1024):if RNG_Continuous_Health_Test(RNG_Generate_Raw_Entropy_Source2()) == -1:return 0x80100002for i in range(1024):if RNG_Continuous_Health_Test(RNG_Generate_Raw_Entropy_Source3()) == -1:return 0x80100003for i in range(1024):if RNG_Continuous_Health_Test(RNG_Generate_Raw_Entropy_Source4()) == -1:return 0x80100004for i in range(1024):if RNG_Continuous_Health_Test(RNG_Generate_Raw_Entropy_Source5()) == -1:return 0x8010005

2)连续健康测试内容:
测试时间:在熵源输入数据时执行。
测试内容:对熵源输出的连续样本进行测试。
测试方法:重复计数测试
测试样本大小:熵源输出的样本。时间样本为4字节,CPU信息样本为16字节,RAM信息为8字节,磁盘信息为8字节,网络信息8字节。
通过条件:未产生连续11个相同的样本。
处理方法:未通过则不能继续使用熵源输出的数据。

def RNG_Continuous_Health_Test(nextRawEntropy:bytes):global HC = 1+ math.ceil(20/H)B = 1global curRawEntropyif nextRawEntropy == curRawEntropy:B += 1if B >= C:return -1else:#not equel, passB = 1curRawEntropy = nextRawEntropyreturn 0

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


https://dhexx.cn/news/show-4628141.html

相关文章

Netty之EventLoop 解读

是什么 EventLoop (事件循环对象)本质是一个单线程执行器(同时维护了一个 Selector),里面有 run 方法处理 Channel 上源源不断的 io 事件。 它的继承关系比较复杂 一条线是继承自 j.u.c.ScheduledExecutorService 因…

C++并发线程 - 如何管控线程【启动/暂停/停止/恢复】

系列文章目录 C高性能优化编程系列 深入理解软件架构设计系列 高级C并发线程系列 深入理解设计模式系列 超越昨天的自己 Keeps going beyond yesterdays own 线程管控 系列文章目录1、线程最基本的使用 - 简单管控2、如何将参数传递给线程3、线程归属权居然是可以转移的4、通…

Testing Spring MVC Web Controller

Overview Problem How can we test Spring MVC Web Controllers?How can we create HTTP requests and send to the controller?How can we verify the response? status_code, view_name, model_attributes. Spring Testing support Mock object support for…

前端046_单点登录SSO_初始化项目(Vue-CLI)

初始化项目 1、安装 node.js 和 npm2、安装 Vue-CLI 脚手架3、导入单点登录项目模版1、安装 node.js 和 npm 下载 http://nodejs.cn/download/安装 查看 npm 版本[root@pgdb ~]# node -v v12.22.12配置 npm 淘宝镜像命令npm config set registry https://registry

了解Session的本质

有一点我们必须承认,大多数web应用程序都离不开session的使用。这篇文章将会结合php以及http协议来分析如何建立一个安全的会话管理机制。 AD: 有一点我们必须承认,大多数web应用程序都离不开session的使用。这篇文章将会结合php以及http协…

【JavaEE】Tomcat-Servelet第一个helloworld程序

Tomcat & Servelet第一个程序helloworld! 文章目录 JavaEE & Tomcat & 第一个Servelet程序1. HTTP服务器 - Tomcat1.1 Tomcat的目录结构:1.2 启动Tomcat1.3 Tomcat的优点 2. Servelet框架2.1 创建Maven项目2.2 引入依赖2.3 创建目录2.4 写代…

AutoHotKey脚本初步:判断和选择

文章目录 脚本基础连击识别setTimer判断和选择 脚本基础 尽管通过窗口识别与按键映射,就可以胜任很多工作了,但AutoHotKey仍提供了一些简单的编程功能,对一些稍微复杂的任务,也可以做到得心应手。但要注意一点,AHK的V…

java关于泛型相关面试题开胃菜

Java中的泛型机制及其用途? Java中的泛型机制是一种允许在编译时检查类型安全的技术。它允许在编写代码时使用类型参数,以便在编译时指定或推断这些参数的类型。这个机制允许程序员编写出更加通用、可重用的代码,从而提高代码的质量和可维护…

深度学习防止过拟合

简化模型减少数据early stop使用预训练模型

Payroll工资单中英文对照明细

不知道大家的工资单是中文的还是英文的,如果是英文的,刚开始看有些看不懂(我就是),那么可以在这里找到对应的翻译。如果中文的,而你又想知道对应英文怎么写的话,也欢迎查阅以下表格。ps.个人所得…