随机数发生器设计(三)

news2024/11/28 14:49:18

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

  • 熵估计
  • 健康测试

熵估计

考虑都熵源的多样性,建立一个通用的熵估计模型比较困难。本文采用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.coloradmin.cn/o/607487.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能python:用Python向手机发送信息是如何实现的?

用Python向手机发送信息是如何实现的? 在今天的信息时代,随时随地保持联系已经成为生活不可或缺的一部分。随着技术的发展,我们可以使用各种方式发送和接收信息,而使用Python向手机发送短信是其中一种非常方便的方式。 Python的…

I.MX6ull EPIT定时器

一 简介 EPIT定时器是一种增强的周期中断定时器,完成周期性中断定时的功能。 具有以下特点 EPIT定时器是一个32位的定时器 时钟源可选的向下计数器 EPIT 共有 3 个时钟源可选择,ipg_clk、ipg_clk_32k 和 ipg_clk_highfreq 当计数值和比较值相等的时候…

兼顾性能+实时性处理缓冲数据解决方案

我们经常会遇到这样的数据处理应用场景:我们利用一个组件实时收集外部交付给它的数据,并由它转发给一个外部处理程序进行处理。考虑到性能,它会将数据存储在本地缓冲区,等累积到指定的数量后打包发送;考虑到实时性&…

ChatGPT与软件架构(3) - 软件架构提示工程

高效利用ChatGPT辅助研发的关键是在研发生命周期的不同阶段采用对应提示获取有益的帮助。原文: Leveraging Prompt Engineering in Software Architecture with ChatGPT 软件架构开发生命周期转型。 Beth Smith Unsplash 简介 作为解决方案架构师,有必要掌握软件架构…

【分布式架构】资源与事务:可观测性的基本二重性

西格曼:我叫本西格曼。我是Lightstep的联合创始人兼首席执行官。我在这里讨论的是资源和事务,这是可观察性的一个基本的二元性。我职业生涯的大部分时间都在研究可观察性。在我职业生涯之初,我在谷歌工作了九年,致力于谷歌的分布式…

SLAM实战项目(1) — ORB-SLAM2稠密地图重建

目录 1 整体思路 2 功能实现 3 结果运行 (1) TUM数据集下载 (2) associate.py用于RGB和Depth匹配 (3) 运行数据集 4 CMakeLists.txt文件修改 5 完整PointCloudMapping.h和PointCloudMapping.cc 6 报错分析 7 思考扩展 文章参考部分开源代码和报错文章 1 整体思路 利…

【微信小程序开发】第 3 节 - 安装开发者工具

欢迎来到博主 Apeiron 的博客,祝您旅程愉快 ! 时止则止,时行则行。动静不失其时,其道光明。 目录 1、缘起 2、微信开发者工具 3、下载 4、安装 5、扫码登录 6、设置外观和代理 7、总结 1、缘起 开发微信小程序从大的方…

吊打面试官的16000字JVM专属秘籍,又一个Java面试神器!终于可在简历写上精通JVM了!

前言 吊打面试官的16000字JVM专属秘籍,总共包含三部分的内容,从基础到进阶带大家一步步深入理解JVM! 学完就可以在简历上面直接写上精通JVM! 因为篇幅限制这里只给大家做简单的一个介绍,也就是进行一个大点的梳理&a…

记录--手把手教你Vue+ECharts+高德地图API实现天气预报数据可视化

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 所谓数据可视化,我们可以理解为从宏观角度来看一眼就能看出来整个数据的占比,走向。对于数据可视化,很多互联网公司是很看重这一块的,包括大厂&…

基于wireshark打造安全分析师工具--解析suricata中的分析结果

从本篇文章开始,我将通过若干篇文章陆续介绍在实际安全运营的过程中,基于wireshark打造安全分析师趁手的流量威胁分析工具,帮助安全分析人员在面对网络数据包取证和分析时候达到事半功倍的效果。本篇文件介绍使用在使用iwreshark分析数据包事…

21天学会C++:Day7----auto关键字

CSDN的uu们,大家好。这里是C入门的第七讲。 座右铭:前路坎坷,披荆斩棘,扶摇直上。 博客主页: 姬如祎 收录专栏:C专题 目录 1. 知识引入 2. auto的使用 2.1 auto与指针和引用结合起来使用 2.2 在同一…

区分序列/UIO/特征集示例

区分序列/UIO/特征集示例 从确定性有限状态机进行测试:检查状态 概述 让我们假设我们有一个状态集 S 的 FSM M。还假设我们知道通过转换 t 达到的当前状态是 s 或 s0。 我们如何确定 t 到达了哪个状态? 分离状态 输入序列 w 将两个状态 s 和 s0 分开&…

C++进阶之继承

文章目录 前言一、继承的概念及定义1.继承概念2.继承格式与访问限定符3.继承基类与派生类的访问关系变化4.总结 二、基类和派生类对象赋值转换基本概念与规则 三、继承中的作用域四、派生类的默认成员函数五、继承与友元六、继承与静态成员六、复杂的菱形继承及菱形虚拟继承七、…

图论试题2020

n-m 2 16 Pk(Kn)k(k-1)…(k-n1)。 C:A2对角线元素aii2等于对应顶点vi的度数,所以对角线元素之和等于边数的两倍。 A的所有特征值的平方和等于A2的对角线元素之和。 B 完全图没有顶点隔,实际上也只有以完全图为生成子图的图没有顶点隔。 连通…

Qt6 C++基础入门1 定时器与QTimer

定时器 定时器图片流水灯案例 实现效果:构建一个界面,点击开始按钮轮流播放文件夹下图片,点击停止按钮停止播放 构建页面,上部是一个没有内容的 label 下面是开始和暂停按钮,各自的名称分别为 startBtn 和 stopBtn 先保…

6.事件绑定

目录 1 事件对象的属性 2 事件绑定方式 3 在事件中赋值 4 事件传参 1 事件对象的属性 target是触发该事件源头的组件,currentTarget是当前事件所绑定的组件,比如现在有一个父组件包着子组件,你给父组件绑定事件,由于事件…

ps磨皮插件专用智能磨皮插件Portraiture4

Portraiture是一款智能磨皮插件,为Photoshop和Lightroom添加一键磨皮美化功能,快速对照片中皮肤、头发、眉毛等部位进行美化,无需手动调整,大大提高P图效率。全新4版本,升级AI算法,并独家支持多人及全身模式…

从0到1深入剖析微服务架构,阿里人十年经验浓缩成一份笔记

前言 数字化经济的快速发展和云计算给底层IT系统带来的巨大变革正是当下微服务架构快速发展的时代背景。Gartner预计,从2018年到2022年,PaaS将成为未来的主流平台交付模式,而PaaS平台需要更加灵活的云原生应用架构做技术支撑,微服…

图论与算法(3)图的深度优先遍历

1. 遍历的意义 1.1 图的遍历 图的遍历是指按照一定规则访问图中的所有顶点,以便获取图的信息或执行特定操作。常见的图遍历算法包括深度优先搜索(DFS)和广度优先搜索(BFS)。 深度优先搜索(DFS&#xff0…

UART串口通信实验

不管是单片机开发还是嵌入式 Linux 开发,串口都是最常用到的外设。 可以通过串口将开发板与电脑相连,然后在电脑上通过串口调试助手来调试程序。 还有很多模块,比如蓝牙、GPS、GPRS等都使用串口与主控进行通信。 UART简介 串口全称串行接口…