GM/T 0105-2021 相关标准英文版PDF
| 标准号码 | 价格美元 | 第2步(购买) | 交付天数 | 标准名称 |
| GM/T 0105-2021 | 530 | GM/T 0105-2021 | 3秒自动 | 软件随机数发生器设计指南 |
| 基本信息 | |
|---|---|
| 标准编号 | GM/T 0105-2021 (GM/T0105-2021) |
| 中文名称 | |
| 英文名称 | Design guide for software-based random number generators |
| 行业 | Chinese Industry Standard (推荐) |
| 中标分类 | L80 |
| 字数估计 | 36,363 |
| 发布机构 | 国家密码管理局 |
GM/T 0105-2021: 软件随机数发生器设计指南
ICS 35.030
CCSL80
中华人民共和国密码行业标准
软件随机数发生器设计指南
2021-10-18发布
2022-05-01实施
国家密码管理局 发 布
目次
前言 Ⅲ
引言 Ⅳ
1 范围 1
2 规范性引用文件 1
3 术语和定义 1
4 缩略语 3
5 软件随机数发生器设计 3
5.1 基本模型 3
5.2 熵源 4
5.3 熵池 5
5.4 熵估计 5
5.5 健康测试 5
5.6 DRNG 6
6 安全分级方法 7
6.1 概述 7
6.2 GB/T 37092安全等级一级 8
6.3 GB/T 37092安全等级二级 8
7 实现 8
7.1 通用 8
7.2 关键安全参数定义 8
7.3 熵源独占性 8
附录A(资料性) 熵源和熵池结构示例 9
附录B(规范性) 基于SM3算法的RNG设计 11
附录C(资料性) 熵估计方法 16
附录D(规范性) 连续健康测试方法 20
附录E(规范性) 基于SM4算法的RNG设计 23
参考文献 29
前言
本文件按照GB/T 1.1-2020《标准化工作导则 第1部分:标准化文件的结构和起草规则》的规定
起草。
请注意本文件的某些内容可能涉及专利。本文件的发布机构不承担识别专利的责任。
本文件由密码行业标准化技术委员会提出并归口。
本文件起草单位:中国科学院数据与通信保护研究教育中心、中国科学院软件研究所、浙江大学、深
圳技术大学、深圳市纽创信安科技开发有限公司、成都卫士通信息产业股份有限公司、中国科学技术大
学网络空间安全学院、成都信息工程大学、中国金融认证中心、北京宏思电子技术有限公司、北京智芯微
电子科技有限公司、智巡密码(上海)检测技术有限公司。
本文件主要起草人:马原、吕娜、陈华、沈海斌、郑昉昱、陈天宇、张翌维、樊俊锋、林璟锵、刘攀、吴鑫莹、
张立廷、吴震、王飞宇、张文婧、胡晓波、范丽敏、韩玮。
引 言
随机数的质量直接影响到密钥生成、数字签名以及其他密码算法和协议的实际安全性。随着软件
密码模块使用越来越广泛,其中的随机数发生器设计备受关注。
本文件为软件随机数发生器的设计提供了通用的基本模型,描述了其基本部件的设计指导和建议,
以指导软件随机数发生器的设计者、开发者和测试者。
软件随机数发生器设计指南
1 范围
本文件给出了软件随机数发生器设计的基本模型、基本部件的设计指南以及安全分级方法,并在附
录中给出了基于SM3算法和基于SM4算法的设计实例。
本文件适用于软件随机数发生器的设计、开发、检测和评估。
2 规范性引用文件
下列文件中的内容通过文中的规范性引用而构成本文件必不可少的条款。其中,注日期的引用文
件,仅该日期对应的版本适用于本文件;不注日期的引用文件,其最新版本(包括所有的修改单)适用于
本文件。
GB/T 15852.1 信息技术 安全技术 消息鉴别码 第1部分:采用分组密码的机制
GB/T 17964 信息安全技术 分组密码算法的工作模式
GB/T 32905 信息安全技术 SM3密码杂凑算法
GB/T 32907 信息安全技术 SM4分组密码算法
GB/T 32915-2016 信息安全技术 二元序列随机性检测方法
GB/T 37092-2018 信息安全技术 密码模块安全要求
GM/Z4001 密码术语
3 术语和定义
GB/T 32915-2016、GB/T 37092-2018和 GM/Z4001界定的以及下列术语和定义适用于本
文件。
3.1
熵 entropy
对一个封闭系统的无序性、随机性或变化性等状态的度量。
注:随机变量X 的熵是对通过观测X 所获得信息量的一个数学度量。
3.2
熵源 entropysource
产生输出的部件、设备或事件。当该输出以某种方法捕获和处理时,产生包含熵的比特串。
3.3
已知答案测试 known-answertest
一种测试确定性机制的方法,即通过该机制处理给定的输入,然后将所得到的输出与已知值进行
比较。
3.4
熵池 entropypool
临时保存熵的存储区域。
3.5
最小熵 min-entropy
熵的下界,是对确定样本熵最坏情况的估值。
注:如果k为最大值,使得P(X=x)≤2-k,那么比特串X(或更准确地说,是形成此类随机比特串的相应的随机变
量)的最小熵为k。也就是说,X 至少包含k比特的熵或随机性。
3.6
产生随机二元序列的器件或程序。
[来源:GB/T 32915-2016,2.2]
3.7
种子 seed
用作随机数发生器的输入的比特串。
3.8
重播种函数 reseedfunction
一种特定的内部状态转移函数,该函数在提供新种子值的情况下更新内部状态。
3.9
与安全相关的秘密信息,这些信息被泄露或被修改后会危及密码模块的安全性。
注:关键安全参数可以是明文形式的也可以是经过加密的。
[来源:GB/T 37092-2018,3.3]
3.10
一种随机数生成器,通过将确定性算法应用于适当的随机初始值(称为“种子”)产生随机样式的比
特序列。
3.11
熵率 entropyrate
平均每比特数据包含的熵的大小。
3.12
明确定义的边线,该边线建立了密码模块的物理和/或逻辑边界,并包括了密码模块的所有硬件、软
件和/或固件部件。
[来源:GB/T 37092-2018,3.4]
3.13
软件随机数发生器 software-basedRNG
软件密码模块(或混合密码模块的软件部件)中的随机数发生器部件,可以单独作为软件密码模块,
也可以作为软件密码模块(或混合密码模块的软件部件)的一部分。
3.14
密码模块 cryptographicmodule
实现了安全功能的硬件、软件和/或固件的集合,并且被包含在密码边界内。
注:密码模块根据其组成,可分为硬件密码模块、固件密码模块、软件密码模块以及混合密码模块。
[来源:GB/T 37092-2018,3.5]
3.15
与安全性相关的公开信息,一旦被修改,会威胁到密码模块安全。
注:例如,公钥、公钥证书、自签名证书、信任锚、与计数器和内部保持的日期和时间相关联的一次性口令。公开安
全参数如果不能被修改或者修改后能够被密码模块发现,此时可以认为该公开安全参数是受保护的。
[来源:GB/T 37092-2018,3.14]
3.16
包括关键安全参数和公开安全参数。
[来源:GB/T 37092-2018,3.17]
3.17
重播种计数器值 reseedcounter
一种内部状态计数器变量,表明自初始化或重播种期间获得新的熵输入以来,请求随机数生成的
次数。
3.18
软件随机数发生器上一次重播种的时间值,单位为秒。
3.19
在软件随机数发生器重播种前,能够产生随机数的最大请求次数。
3.20
重播种时间阈值 reseedtimethreshold
距离软件随机数发生器上一次重播种的最大时间间隔,单位为秒。
4 缩略语
下列缩略语适用于本文件。
SRNG:软件随机数发生器(Software-basedRNG)
IV:初始向量(InitialVector)
5 软件随机数发生器设计
5.1 基本模型
本文件给出的软件随机数发生器基本模型见图1,主要包含系统熵源、熵估计、熵池、DRNG和健康
测试等部分。其中,DRNG主要由内部状态、初始化函数、重播种函数、输出函数、自测试等基本部件
组成。
图1 软件随机数发生器的基本模型
软件随机数发生器收集系统熵源的随机性作为其随机性的来源(随机性的来源也可以来自系统或
硬件随机数发生器)。系统熵源的数据进入熵池进行熵累积,等待收集足够的熵源数据,在对熵池中的
数据经扩展函数压缩后,与系统或硬件随机数发生器的输出数据(可选)经数据拼接后一同作为DRNG
的输入产生种子。DRNG经过初始化,开始内部状态的迭代以及必要的重播种操作,以产生所需数量
的随机数。除熵输入外,DRNG输入还包括nonce(必选)、个性化字符串(可选)和额外输入(可选)。
为保证软件随机数发生器的安全性,需要对熵源的熵进行熵估计,以及对熵源的状态进行必要的健
康测试。对于一个关键安全参数,其收集的最小熵值应符合GB/T 37092-2018的要求,本文件以256
比特的最小熵值为基准来给出软件随机数发生器的参数信息。
5.2 熵源
熵源是软件随机数发生器随机性的来源。由于软件密码模块运行在通用操作系统上,因此其随机
性的来源也一般依赖操作系统提供,包括系统时间、特定的系统中断事件、磁盘状态、人机交互输入事件
(如按键、鼠标移动等动作)等。为了保障软件随机数发生器的可靠性,建议随机性来源不少于3种。
A.2以操作系统中的中断事件为例,给出如何从中断事件中提取随机性。
此外,在特定的软硬件平台上,熵源也可以是平台已有的随机数发生器,包括硬件随机数发生器和
系统随机数发生器(见图1),如基于CPU抖动的随机数发生器、CPU内置的硬件随机数发生器、外部
硬件随机数发生器部件等。软件随机数发生器也可以用这些特定软硬件平台上的熵源作为熵输入来增
大随机性,但仍然需要保证在没有这些熵源时,输入的熵仍然是充足的。不同的是,为了考虑效率和安
全性,图1中的系统熵源的输出数据需要在熵池中累积并经过扩展函数输出后再作为DRNG的熵
输入。
5.3 熵池
熵池作为软件随机数发生器中保证熵采集的重要部件,在空闲时,RNG可以把熵源输出收集起来;
当需要时,可以及时从熵池中读取所需的数据,从而减少产生随机数的延迟。此外,为增加熵源数据混
淆、节省熵池空间,熵池内可采用迭代压缩函数来增加熵率,如通过循环移位寄存器实现。如果熵池太
小会导致累积的熵不足,如果熵池太大则浪费内存空间。出于以上考虑,熵池大小应大于或等于512字
节,但不宜超过4096字节。A.3给出了一种基于循环移位寄存器的熵池结构示例。
在收到DRNG初始化或重播种请求时,在熵池中的熵值大于256比特后(根据5.4的熵估计结
果),所有熵池中的数据进行压缩后与图1中的系统RNG(可选)或硬件RNG(可选)的输出数据经数据
拼接后一同作为DRNG的输入。同时,扩展函数压缩后的结果也反馈回熵池中,以保证后向安全性。
为保证熵池中的熵能够最大限度的保持,可使用密钥扩展函数作为压缩算法,仅使用密码杂凑算法无法
保证压缩结果是满熵(ful-entropy)的。一种基于SM3密码杂凑算法的密钥扩展函数(SM3_df)按附录
B,输出长度可设置为440比特。有关SM3密码杂凑算法的计算方法按GB/T 32905。
5.4 熵估计
熵估计是保证随机数发生器安全性的关键。系统熵源一般属于非物理熵源,因此难以建立一个可
靠的数学模型对熵源的随机行为进行刻画,也难以进一步通过理论建模的方法对熵源的熵进行估计。
本文件给出了一种离线统计熵估计的方法,对系统熵源的最小熵进行估计(见附录C),其中包含了一种
较为通用的基于马尔可夫预测器的熵估计器,更多的熵估计器可以参考文献[2][5]。此外,对使用外部
随机数发生器作为熵输入的情况(如系统RNG或硬件RNG),统计熵估计也适用于对这些随机数发生
器输出的熵估计。
5.5 健康测试
健康测试用于监测熵源的状态,以保证随机数发生器运行时的安全。健康测试包括上电健康测试、
连续健康测试和按需健康测试三种。
a) 上电健康测试:
● 在软件随机数发生器或其所在的密码模块上电或重启,以及首次使用熵源之前执行;
● 上电健康测试可以确保熵源在正常运行条件下使用前可以按预期工作,并且自上次上电
健康测试以来没有发生任何故障;
● 上电健康测试需要对至少1024个连续样本执行连续健康测试;
● 在上电健康测试期间,熵源的输出不能用于其他操作;
● 在测试完成后且没有发现任何故障或错误,那么可以考虑使用测试期间的熵源的输出。
b) 连续健康测试:
● 连续健康测试关注熵源的行为,在熵源工作时,持续地检测从熵源得到的所有数字化的样
本,目的是当熵源输出时能够及时发现熵源潜在的多种故障,执行该测试时无需禁止熵源
的输出;
● 在熵源正常运行时,该测试的误警率应非常低,在许多系统中,一个合理的误警率策略可
以保证即便在很长的使用时间内也几乎不会发生故障报警;
● 连续健康测试会受到资源限制,这个限制将影响检测到熵源故障的能力,因此,连续健康
测试通常被设计成检测严重故障。
c) 按需健康测试:
● 可以在任何时候被执行;
● 在按需健康测试的过程中,从熵源收集的数据在测试完成前不应使用,可以随时丢弃,也
可以在测试完成后且未发生任何错误的情况下使用。
上述三种健康测试方法中,上电健康测试和连续健康测试是应做的。附录D给出了连续健康测试
方法,包含2个测试算法:重复计数测试和自适应比例测试。除了附录D中的两种算法外,设计者也可
以遵循如下两个要求,根据具体设计提出其他的连续健康测试方法。
a) 如果一个样本在熵源采样序列中连续出现超过
100
次(H 为通过附录C估计的样本最小
熵),那么连续健康测试方法应至少以99%的概率检测到该值;
b) 令P=2-H,如果熵源的行为发生了变化,使得观察到特定样本值的概率至少增加到P*=
2-H/2,那么当检查来自该熵源的5万个连续样本时,连续健康测试方法应至少以50%的概率
检测到这种变化。
5.6 DRNG
5.6.1 概述
本文件给出的DRNG架构见图1,对外接口包括初始化函数、重播种函数、输出函数。DRNG还在
内部维持了内部状态,同时利用自测试模块对自身进行测试,确保DRNG在运行过程中能够及时检测
出故障。本文件给出了两种DRNG的设计实例,包括基于SM3算法(见GB/T 32905)的DRNG和基
于SM4算法(见GB/T 32907)的DRNG,分别见附录B和附录E。根据使用的密码算法不同,其内部状
态组成、函数计算过程以及参数要求等不同,下面给出了DRNG中的内部状态以及相关函数的总体设
计说明,关于具体参数要求、赋值要求等按附录B和附录E。
5.6.2 内部状态
DRNG的内部状态可视为软件随机数发生器的内部(临时)存储,由DRNG所使用或执行的所有参
数、变量以及其他存储的值组成。DRNG的内部状态包括:
a) 敏感状态信息:DRNG的熵输入数据直接决定了DRNG的敏感状态信息的初始值,DRNG根
据敏感状态信息借助伪随机数生成算法直接产生随机数,并在每次生成随机数时按照一定规
则不断迭代更新敏感状态信息,由于敏感内部状态直接决定了当前以及下一次重播种之前的
所有随机数,它应看作GB/T 37092-2018中的关键安全参数受到保护,不能被非授权地访
问、使用、泄露、修改和替换;
b) 管理状态信息:即与DRNG运行相关的管理状态信息,包括重播种计数器值、上次重播种时间
值,管理状态信息应看作GB/T 37092-2018中的公开安全参数受到保护,不能被非授权地修
改和替换;
c) 常量值:重播种计数器阈值和重播种时间阈值,该常量值与安全等级有关,不同安全等级的
SRNG,重播种计数器阈值和重播种时间阈值有所不同(见6.2和6.3)。
5.6.3 初始化函数
初始化函数利用熵源数据、nonce和个性化字符串对初始状态进行赋值。nonce可以提供除熵源数
据之外的额外安全保障,在软件RNG的熵源存在故障时提供额外的安全防护,降低DRNG在多次实例
化过程中可能存在的风险。例如,一个存在故障的系统每次开机后在熵池中总是累积相同的熵源数据,
此时如果不使用nonce值,那么每次初始化后将会产生相同的随机数,nonce的使用可以在一定程度上
缓解这一问题。个性化字符串的使用,可以降低不同平台上同一个软件RNG机制产生随机数过程中
的安全风险。例如,存在故障的多个系统可能在熵池中累积了相同的熵源数据,如果没有使用个性化字
符串,它们将会产生相同的随机数。
DRNG自身的安全性应不依赖于nonce和个性化字符串的保密性。对nonce和个性化字符串的设
计建议如下。
a) nonce(必选输入):
● nonce应至少具有128比特熵,或者预期重复概率不大于2-128;
● nonce可以是随机值、时间戳、单调递增的计数器值或者它们的组合。
b) 个性化字符串(可选输入):
● 如果使用个性化字符串,则个性化字符串与熵源数据以及nonce一起生成DRNG的初始
种子;
● 对于相同DRNG机制在不同平台的各个实例,个性化字符串需要具有唯一性;
● 个性化字符串可包含的内容包括但不限于:设备序列号、公钥信息、用户标识、时间戳、网
络地址、应用程序标识符、协议版本标识符。
5.6.4 重播种函数
重播种函数利用熵源数据、额外输入(可选)对内部状态进行更新。
额外输入可以是秘密的,也可以是公开的,但DRNG自身的安全性应不依赖于额外输入的保密性。
额外输入可以为DRNG提供更多熵,如果额外输入是非公开的并且有充足的熵,可以为DRNG提供更
多的安全保证。
除了可以在调用重播种函数时注入额外输入外,也可以在每次调用输出函数时注入额外输入。
5.6.5 输出函数
输出函数利用DRNG的内部状态和额外输入(可选)通过特定的密码计算产生随机数据,同时更新
DRNG的内部状态。可选的额外输入的要求与重播种函数中的额外输入要求一致。
本文件建议输出函数每次调用只能输出一组随机数据,其中基于SM3算法的DRNG输出一组随
机数据的长度为256比特,基于SM4算法的DRNG输出一组随机数据的长度为128比特。
5.6.6 DRNG自测试
类似于GB/T 37092-2018中密码模块的自测试,DRNG也需要执行自测试以确保设计的DRNG
能够持续按照所设计和实现的方式正确运行。
本文件给出的DRNG采用已知答案测试,即DRNG实例利用已知的输入调用初始化函数、重播种
函数和输出函数,并确认输出与预期答案是否一致,如果一致,则通过自测试;否则DRNG需要进入错
误状态,并返回错误指示信号。
对DRNG的自测试可以作为其所在软件密码模块自测试的一部分,也可以单独执行。但无论以何
种形式进行,对DRNG的自测试需要满足与所在软件密码模块的安全等级相对应的自测试要求(按
GB/T 37092-2018中7.10)。在执行自测试时,应禁止从DRNG边界内输出数据;在DRNG正常运行
期间,已知答案测试的结果不能作为随机数据输出。
6 安全分级方法
6.1 概述
由于不同级别的密码模块的安全防护要求不相同,本文件针对DRNG重播种机制,从种子的使用
时长和使用次数两方面考虑,对满足GB/T 37092-2018安全等级一级和安全等级二级密码模块中的
软件随机数发生器给出分级方法。
6.2 GB/T 37092安全等级一级
在GB/T 37092-2018安全等级一级的密码模块中,对于DRNG每一组新输入的熵(通过初始化
或种子更新获得),当以下任意条件满足时,需要对DRNG执行重播种操作:
a) 距离上一次DRNG重播种时间超过600s(即,重播种时间阈值为600s);
b) 输出函数已被调用220次(即,重播种计数器阈值为220)。
6.3 GB/T 37092安全等级二级
在GB/T 37092-2018安全等级二级的密码模块中,对于DRNG每一组新输入的熵(通过初始化
或种子更新获得),当以下任意条件满足时,需要对DRNG执行重播种操作:
a) 距离上一次DRNG重播种时间超过了60s(即,重播种时间阈值为60s);
b) 输出函数已被调用210次(即,重播种计数器阈值为210)。
7 实现
7.1 通用
软件随机数发生器既可以是单独的软件密码模块,也可以作为软件密码模块(或混合密码模块的软
件部件)的一部分,在实现时应符合GB/T 37092-2018的所有适用指标。
7.2 关键安全参数定义
软件随机数发生器相关部件的关键安全参数见表1,包括熵源、熵池和DRNG所涉及的关键安全
参数。
表1 软件随机数发生器的关键安全参数
软件随机数发生器部件 关键安全参数
熵源 熵源产生的熵
熵池 循环移位寄存器的状态
DRNG
内部状态中的敏感状态信息
熵输入
输出的随机数
7.3 熵源独占性
熵源同一时刻只能被一个软件随机数发生器独占访问,以保证软件随机数发生器独占过程中所读
取的熵源数据无法被其他实体(例如,同一运行环境下的其他进程)获取,可以通过如下机制来保证熵源
独占性:
---软件随机数发生器本身的机制,例如,熵源本身是软件随机数发生器的一部分,软件随机数发
生器自身的机制保证熵源访问的独占性;
---熵源本身的机制,例如,熵源同一时刻只能为一个实例提供熵,当熵源被占用时,将拒绝其他实
体的访问;
---运行环境的安全机制,例如,操作系统通过互斥锁的机制,保证只有一个实体可以访问该熵源。
附 录 A
(资料性)
熵源和熵池结构示例
A.1 概述
本附录给出了一种基于操作系统中断事件的熵源示例,以及一种基于循环......
英文网页English: GM/T 0105-2021
相关标准: GB/T 15843.1|GM/T 0104|GM/T 0106|GM/T 0103|GM/T 0105-2021|GM/T 0105|