随机数发生器设计(三)

news/2024/5/5 22:40:15

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

  • 熵估计
  • 健康测试

熵估计

考虑都熵源的多样性,建立一个通用的熵估计模型比较困难。本文采用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 = 0
    N1 = 0
    N00 = N01 = N10= N11 = 0
    lastN = 2
    for i in epsilon:
        if i == 0:
            N0 += 1
            if lastN == 1:
                N10 += 1
            elif lastN == 0:
                N00 += 1

        else:
            N1 += 1
            if lastN == 1:
                N11 += 1
            elif lastN == 0:
                N01 += 1
        lastN = i
    P0 = N0/len(epsilon)
    P1 = 1-P0
    P00 = 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 1
    for 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 2
    tempbytes2 = 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 3
    tempbytes3 = 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 4
    temp4 = 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 5
    temp5 = 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 test
    for i in range(1024):
        if RNG_Continuous_Health_Test(RNG_Generate_Raw_Entropy_Source1()) == -1:
            return 0x80100001
    for i in range(1024):
        if RNG_Continuous_Health_Test(RNG_Generate_Raw_Entropy_Source2()) == -1:
            return 0x80100002
    for i in range(1024):
        if RNG_Continuous_Health_Test(RNG_Generate_Raw_Entropy_Source3()) == -1:
            return 0x80100003
    for i in range(1024):
        if RNG_Continuous_Health_Test(RNG_Generate_Raw_Entropy_Source4()) == -1:
            return 0x80100004
    for 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 H
    C = 1+ math.ceil(20/H)
    B = 1
    global curRawEntropy
    if nextRawEntropy == curRawEntropy:
        B += 1
        if B >= C:
            return -1
    else:#not equel, pass
        B = 1
        curRawEntropy = nextRawEntropy
    return 0

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


http://www.niftyadmin.cn/n/393898.html

相关文章

图论试题2021

25 A:最大度是7,大于了顶点数6,故不是简单图的度序列。 C:树的度序列至少要有两个度为1的顶点 D:只要度数为奇数的个数有偶数个,就是度序列。 A:每棵树的中心由一个点或两个相邻点组成 B&…

对Java远程热部署实践学习和分析

目录 一、热部署现状和必要性分析 (一)热部署定义和现状分析 (二)技术实现难度分析 (三)其必要性分析 二、走进美团Java远程热部署实践 (一)Sonic分析 (二&#x…

springboot+vue+elementui计算机专业课程选课管理系统vue

本系统的主要任务就是负责对学生选课。主要用户为老师、学生,其中,学生可对自己的信息进行查询,可以进行选课,也可以进行删除已选课程,教师可对学生和课程的信息进行查询,教师拥有所有的权限,可以添加删除学生信息。系统提供界面,操作简单。 为实现这些功能,系统一个…

Linux 实操篇-进程管理(重点)

Linux 实操篇-进程管理(重点) 基本介绍 在LINUX 中,每个执行的程序都称为一个进程。每一个进程都分配一个ID 号(pid,进程号)。>windows > linux每个进程都可能以两种方式存在的。前台与后台,所谓前台进程就是用户目前的屏幕上可以进行操作的。后…

微信小程序uniapp医患管理系统预约挂号就诊处方满意评价系统

从系统开发环境、系统目标、设计流程、功能设计等几个方面对系统进行了系统设计。开发出本医患关系管理系统,主要实现了管理员后端;首页、个人中心、用户管理、医生管理、医生信息管理、患者信息管理、预约就诊管理、就诊信息管理、投诉管理、投诉反馈管…

Redis的网络模型

Redis是单线程还是多线程? Redis3.0之前都是单线程 1)如果只是针对于Redis的核心业务部分(命令处理),答案是单线程 2)如果是说整个redis,那么就是多线程 在Redis的版本迭代过程中,在两个非常重要的时间节点上引入了对多线程的支持…

Spring-Cloud-Gateway 整合 Sa-Token 全局过滤器之路由匹配

Spring-Cloud-Gateway 整合 Sa-Token 全局过滤器之路由匹配 Sa-Token 是一个轻量级 Java 权限认证框架,主要解决:登录认证、权限认证、单点登录、OAuth2.0、分布式Session会话、微服务网关鉴权 等一系列权限相关问题。 Sa-Token 旨在以简单、优雅的方式完…

如何通过控制点或地物点生产地方坐标系的倾斜摄影三维模型数据?

如何通过控制点或地物点生产地方坐标系的倾斜摄影三维模型数据? 要生成地方坐标系的倾斜摄影三维模型数据,需要进行以下步骤: 1、收集影像数据 首先需要采集大量的航空影像和地面影像,以构建真实世界中的物体模型。这些影像可以…