随机数发生器设计(四)

news2025/1/24 22:29:28

随机数发生器设计(四)- DRNG

    • 概述
    • 1 内部状态
    • 2 初始化函数
    • 3 SM3派生函数
    • 4 其他部分

概述

本示例DRNG设计参考了GM/T 0105 ,基于SM3算法实现,内部功能接口包括初始化函数、重播种函数、输出函数和已知答案自测试函数,同时还具备DRNG内部状态和错误状态两种内部工作状态。整体框图如下图所示。
DRNG结构

1 内部状态

内部状态包括{V, C, reseed_counter, last_reseed_time, reseed_counter_interval, reseed_time_interval },定义如下:
——比特串V,长度为440比特,每次随机数生成时会进行更新;
——比特串C,长度为440,每次重播种时会进行更新;
——reseed_counter, 在初始化或重播种之后,请求随机数的次数,每次执行随机数生成操作时会加1;
——last_reseed_time,上次重播种的时间值,Unix 时间戳,单位为秒;
——reseed_counter_interval,重播种计数器阈值,该值为常量值1024;
——reseed_time_interval,重播种时间阈值,单位为秒,该值为常量值60s。

2 初始化函数

初始化函数中利用熵源数据对初始状态进行赋值,包含变量初始化和初始化种子函数:
SM3_RNG_Instantiate(nonce)
输入:
——entropy_input:从熵池获取熵压缩函数处理后的结果,长度为440比特。
——nonce: 系统启动时间、当前时间戳、递增计数器信息和固定的随机比特串。
输出:
——初始化内部状态,即V, C, reseed_counter, last_reseed_time, reseed_counter_interval, reseed_time_interval的初始值。
Nonce包括系统启动时间、当前时间戳、递增计数器信息和固定的随机比特串。如下表所示。

熵源说明长度(字节)
CPU信息系统时间(精确到微妙)4
时间信息UTC时间信息(精确到纳秒)4
递增计数器每次调用增14
固定随机值产生自真随机数发生器的随机数128

初始化流程如下:
a) 获取440比特的熵输入entropy_input;
b) 生成种子seed = SM3_df(entropy_input || nonce, seedlen)。Seedlen为440比特;
c) 初始化内部状态变量,包括V、C、reseed_counter。其中V = seed,C = SM3_df (0x00||V, seedlen),reseed_counter = 1;
d) 返回内部状态变量。

#generate nonce
def RNG_Gen_Nonce():
    global nonce_counter
    boottime = (int(psutil.boot_time()) & 0xFFFFFFFF).to_bytes(4, byteorder = 'big', signed=False)
    timestamp = (int(time_ns()) & 0xFFFFFFFF).to_bytes(4, byteorder = 'big', signed=False)
    counterbytes = nonce_counter.to_bytes(4, byteorder = 'big', signed=False)
    fixrandom = bytes.fromhex("331051e42be3c2139b4077728785ff2553d1d7ffc7c98377875581837ee6a99501bd28a12c491ea656e5666286fdabc56bb05d811596e9667b165367c7d2e4c8")
    nonce_counter += 1
    return boottime + timestamp + counterbytes + fixrandom
def SM3_RNG_Instantiate(nonce):
    global min_length
    global max_length
    # min_entropy = min_length

    while True:
        (status, entropy_input) = Get_entropy (256, min_length, max_length)
        if status == -2:#need time to generate entropy
            continue
        if status != 0:
            print('entropy source error! please check system source.')
            return -1
        break
    seed = SM3_df(entropy_input + nonce, seedlen)
    reseed_counter = 1
    return Working_state(seed, SM3_df ((bytes([0x00])+ seed), seedlen), reseed_counter)
def Get_entropy (min_entropy, min_length, max_length):
    global drngentropy
    global drngentropylock
    #compress functiong output is about 340*8bits
    if min_entropy > 340*8:#min entropy is too big
        return (-1, bytes()) 
    drngentropylock.acquire()
    #drngentropy is 440 bits fixed, min_length is not expected bigger than 440
    if min_length > (len(drngentropy)*8):#need time to generate entropy
        drngentropylock.release()
        return (-2, bytes()) 
    #retdrngentropy is the var to return
    retdrngentropy = drngentropy
    #clear drngentropy
    drngentropy = bytes()
    drngentropylock.release()
    # print('main thread get entropy OK----')
    return (0,retdrngentropy)
    

3 SM3派生函数

SM3_df在软件随机数发生器的初始化和重播种阶段使用,对输入字符串进行杂凑运算,并返回请求的随机比特串。定义如下:
函数定义: SM3_df(input_string, no_of_bits_to_return)
输入:
——input_ string:输入字符串
——number_of_bits_to_return:SM3_df函数返回的比特长度
输出:
requested_bits:SM3_df函数返回的结果。
SM3_df函数作为扩展函数,实现流程如下。
1) 根据输入的返回数据长度(实际为440比特)和输出数据长度256比特计算循环次数。计算循环次数时使用向上取整方式。
2) 对计数器赋初值1,对临时数据赋初值空。
3) 计算SM3(计数器值||返回数据长度||输入熵源数据)。
4) 临时数据更新为临时数据||SM3结果。
5) 计数器增1。
6) 判断循环是否结果,若结束则跳转至第7步,否则跳转至第3步。
7) 取临时数据左侧指定长度数据,返回。

def sm3Hash(hashbytes:bytes):
    temp = sm3_hash([i for i in hashbytes])
    return bytes.fromhex(temp)

def SM3_df(input_string, no_of_bits_to_return):
    temp = bytes([])
    len = math.ceil(no_of_bits_to_return/outlen)
    counter = 0x01
    for i in range(len):
        temp = temp + sm3Hash(bytes([counter]) + no_of_bits_to_return.to_bytes(4, 'big') + input_string)
        counter = counter + 1
    return temp[0:int(no_of_bits_to_return/8)]

4 其他部分

随机数发生器中的重播种函数函数、输出函数、自测试函数放在下篇文章介绍。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/632147.html

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

相关文章

正点原子STM32(基于HAL库)5

目录 SRAM 实验存储器简介SRAM 方案简介硬件设计程序设计程序流程图程序解析 下载验证 内存管理实验内存管理简介硬件设计程序设计程序流程图程序解析 下载验证 SD 卡实验SD 卡简介SD 物理结构命令和响应卡模式数据模式 SDIO 接口简介SDIO 主要功能及框图SDIO 的时钟SDIO 的命令…

《程序员必备品质》——沉稳1

目录 前言: 一.言论有分寸 1.1不抱怨不指责 1.2谈话时不触及别人的短 1.3学会装聋作哑 二.沉心静气 2.1先稳定情绪再解决问题 2.2急于求成则遇速不达 三.结尾 前言: 这周,我细细的读了一本书,还没精读完,不过…

华为OD机试真题 JavaScript 实现【最多几个直角三角形】【2023Q1 100分】

一、题目描述 有 N 条线段&#xff0c;长度分别为 a[1]-a[n]。 现要求你计算这 N 条线段最多可以组合成几个直角三角形&#xff0c;每条线段只能使用一次&#xff0c;每个三角形包含三条线段。 二、输入描述 第一行输入一个正整数 T (1< T< 100) &#xff0c;表示有…

开源WebRTC库放大器模式在采集桌面图像时遇到的DPI缩放与内存泄漏问题排查

目录 1、在非100%的显示比例下放大器采集到的桌面图像不全问题 1.1、通过manifest文件禁止系统对软件进行缩放 1.2、调用SetThreadDpiAwarenessContext函数&#xff0c;禁止系统对目标线程中的窗口进行缩放 1.3、使用winver命令查看Windows的年月版本 2、使用放大器模式遇…

4年经验去面试21k测试岗,看到这样的面试题我还是心虚了....

我是着急忙慌的准备简历——4年软件测试经验&#xff0c;可独立测试大型产品项目&#xff0c;熟悉项目测试流程...薪资要求&#xff1f;4年测试经验起码能要个21K吧 我加班肝了一页半简历&#xff0c;投出去一周&#xff0c;面试电话倒是不少&#xff0c;自信满满去面试&#…

Highcharts for Python crack

Highcharts for Python crack   Aligned the API with Highcharts Core v11.1. In particular, this includes:   Added AccessibilityPoint.description_format property.   Added support for .legend_symbol to plot options and series options.   Added .border_…

6月10日两练来了!

今天是2023年6月10日&#xff0c;每日两练来了&#xff01; 一。围城 题目 编程星球上有一片100*100的空地&#xff0c;啊哈沃德在此处建立了N座发电站&#xff0c;每座发电站占地位置1*1格。 为了防止源码巨人的攻击&#xff0c;啊哈沃德需要在所有发电站外围修建电网&#x…

redis第九章-Redis队列Stream、Redis6多线程详解

Redis队列Stream 前置说明&#xff1a;Redis5.0 最大的新特性就是多出了一个数据结构 Stream&#xff0c;它是一个新的强大的支持多播的可持久化的消息队列&#xff0c;作者声明 Redis Stream 地借鉴了 Kafka 的设计。 Redis Stream 的结构如上图所示,每一个Stream都有一个消息…

【浅谈DBA 最重要的素质---读书笔记】

&#x1f448;【上一篇】 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 【下一篇】&#x1f449; &#x1f53b;【来自DBA大佬的见解1】 对于一个准备进入 DBA 领域的人&#xff0c;我希望他勤奋、严谨、具有钻研精神及独立思考能力。…

Android应用程序进程的启动过程

Android应用程序进程的启动过程 导语 到这篇文章为止&#xff0c;我们已经简要地了解过了Android系统的启动流程了&#xff0c;其中比较重要的内容有Zygote进程的启动和SystemService以及Launcher的启动&#xff0c;接下来我们将要学习的是Android应用程序的启动过程&#xff…

Python爱好者的自我修养(1):简单输入与输出

Python简单输入与输出 1.输出1.1 简单输出1.2 转义字符1.2.1 定义1.2.2 常见的转义字符用法 2.输入3.温馨提示 终于…… 终于…… 我开始玩Python了 &#xff08;不是C不学了哈&#xff0c;C还是照更~&#xff09; 今天先来简单讲下输入和输出 1.输出 1.1 简单输出 输出的函…

【一篇让你学会】Web接口测试工具--Jmeter

关于Jmeter性能测试工具不再过多介绍。如果你要学习软件性能测试&#xff0c;那么多少应该会对它有所耳闻。 强烈建议阅读官方文档学习&#xff1a;http://jmeter.apache.org/index.html 还有比这个更权威更全面的介绍Jmeter工具使用的么&#xff1f; 不过&#xff0c;此处要介…

Win7批量执行Python文件

问题背景 平时都是用Pycharm跑代码&#xff0c;但是每次都需要在Configuration里修改Parameters&#xff0c;跑完一个才能重新修改跑下一个&#xff0c;很不方便&#xff0c;于是决定借助.bat文件实现批量执行。 困难一 电脑存在cmd闪退问题&#xff0c;之前一直逃避懒得解决…

ExtractOfficeContent: 提取Office文件中文本、表格和图像

引言 最近有空写了一下这个库&#xff0c;用来提取Office文件中的文本和图像内容&#xff0c;用作后续整理训练语料使用。最新更新请移步&#xff1a;Github Extract Office Content Use Installextract_office_content$ pip install extract_office_contentRun by CLI. Ext…

STM32——04-初识STM32单片机

什么是单片机&#xff1f; 单片机&#xff08; Single-Chip Microcomputer &#xff09;是一种集成电路芯片&#xff0c;把具有数据处理能力的中央处 理器 CPU 、随机存储器 RAM 、只读存储器 ROM 、多种 I/O 口和中断系统、定时器 / 计数器等功 能&#xff08;可能还包括显示驱…

day49_mybatis

今日内容 1 引言 2 MyBatis介绍 3 环境搭建 4 入门演示(MyBatis开发步骤) 5 CRUD 6 配置细节 一、引言 1.1 复习 第一阶段(JavaSE) java基本语法流程控制面向对象常用类集合异常IO多线程JDK新特性 第二阶段(JavaWeb) 前端 htmlcssjs --> JQueryboostraplayui 页面元素内置模…

攻防世界—file_include

打开之后发现是一段php代码 可以看出这是段代码有文件包含漏洞 下面是学习部分。。。着急看题解继续往下滑。。。谢谢。。。 文件包含漏洞&#xff08;File Inclusion Vulnerability&#xff09;是一种Web应用程序常见的安全漏洞&#xff0c;也是攻击者常用的攻击手段之一。这种…

一文讲完Java常用设计模式(全23种)

文章目录 介绍设计模式的六大原则一、创建型模式1、单例模式&#xff08;Singleton Pattern&#xff09;1&#xff09;饿汉式2&#xff09;懒汉式&#xff0c;双检锁3&#xff09;静态内部类4&#xff09;枚举 2、原型模式&#xff08;Prototype Pattern&#xff09;3、工厂模式…

基于Java+SpringBoot+Vue前后端分离教学资源共享平台系统

博主介绍&#xff1a;✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

10:00面试,10:08就出来了 ,问的实在是太...

从外包出来&#xff0c;没想到算法死在另一家厂子 自从加入这家公司&#xff0c;每天都在加班&#xff0c;钱倒是给的不少&#xff0c;所以也就忍了。没想到8月一纸通知&#xff0c;所有人不许加班&#xff0c;薪资直降30%&#xff0c;顿时有吃不起饭的赶脚。 好在有个兄弟内…