CN113556228B - 可用作种子的伪随机数的生成与相应唯一编码的生成方法 - Google Patents

可用作种子的伪随机数的生成与相应唯一编码的生成方法 Download PDF

Info

Publication number
CN113556228B
CN113556228B CN202110865376.9A CN202110865376A CN113556228B CN 113556228 B CN113556228 B CN 113556228B CN 202110865376 A CN202110865376 A CN 202110865376A CN 113556228 B CN113556228 B CN 113556228B
Authority
CN
China
Prior art keywords
random number
pseudo
cpu
random
generating
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN202110865376.9A
Other languages
English (en)
Other versions
CN113556228A (zh
Inventor
黄博暄
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Individual
Original Assignee
Individual
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Individual filed Critical Individual
Priority to CN202110865376.9A priority Critical patent/CN113556228B/zh
Publication of CN113556228A publication Critical patent/CN113556228A/zh
Application granted granted Critical
Publication of CN113556228B publication Critical patent/CN113556228B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L9/00Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols
    • H04L9/08Key distribution or management, e.g. generation, sharing or updating, of cryptographic keys or passwords
    • H04L9/0861Generation of secret information including derivation or calculation of cryptographic keys or passwords
    • H04L9/0869Generation of secret information including derivation or calculation of cryptographic keys or passwords involving random numbers or seeds
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L9/00Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols
    • H04L9/06Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols the encryption apparatus using shift registers or memories for block-wise or stream coding, e.g. DES systems or RC4; Hash functions; Pseudorandom sequence generators
    • H04L9/0643Hash functions, e.g. MD5, SHA, HMAC or f9 MAC

Landscapes

  • Engineering & Computer Science (AREA)
  • Computer Security & Cryptography (AREA)
  • Computer Networks & Wireless Communication (AREA)
  • Signal Processing (AREA)
  • Power Engineering (AREA)
  • Storage Device Security (AREA)

Abstract

本发明公开了一种可用作种子的伪随机数的生成与相应唯一编码的生成方法,具体包括以下内容:提供了一种基于CPU的时钟周期和系统负载作为熵源的方法生成更加高分辨、离散且随机呈弱线性正相关的离散伪随机数,该伪随机数可在每一次或若干次重复调用伪随机数生成函数时刷新重设以作为即时的、可变的种子使用,以生成具有更强随机性质的随机数位流,用于密码学相关操作;亦可作为盐在使用机器本体标识码与散列函数的随机唯一编码的生成中被使用。本发明通过真熵源的引入、时间计量方式的转变,从技术层面上使得随机数位流的生成具有生成过程随机以及统计指标随机,具有更强的抗正向破译能力;唯一编码则具有因机而异、因时而异的特性。

Description

可用作种子的伪随机数的生成与相应唯一编码的生成方法
技术领域
本发明涉及计算机密码学离散伪随机数生成技术领域,尤其涉及一种利用系统负载与变频CPU的时钟周期为伪随机数生成函数提供离散随机数作为种子的计算机程序与方法。
背景技术
目前,应用于公钥密码学密钥生成和握手变值生成中的伪随机数生成函数(PRNG)通常利用一个确定性算法生成随机数输出位流,生成输出位流的过程需要通过一个熵源产生种子以进行反馈运算,这样的种子往往采用精确到秒的系统时间std::ctime()来生成(引证于C++官网刊载的库函数官方电子说明书,参见http://www.cplusplus.com/reference/cstdlib/srand)。由于一次密码操作中可能需要若干甚至大量的随机数位流序列,而由于现代计算机较高的计算速度,所有若干的密码操作通常能够在一秒内完成。因此,公知的方法是利用首次调用生成的精确到秒的时间作为固定的种子源重复调用伪随机数生成函数生成多组随机数位流序列运用于密码学的相关操作。
但是,以精确到秒的时间作为固定种子期望生成随机数位流序列的过程实际上成为了一种由有限到有限的不安全的映射,虽然可能仍然满足统计随机指标的要求,但是从生成过程的角度来讲则没有达到生成过程随机,实际上是一一对应的(只要拥有特定的一个种子,即可根据固定流程生成完全相同的随机数序列),这意味着通过以有限个数的时间种子穷举输入于伪随机数生成函数(PRNG),破译者往往可以在更短的时间内得到与目标随机数位流序列相同的随机数位流序列而进行正向破译,而不需用对利用随机数位流生成的更长涉密序列进行逆向穷举破译,为密钥或密文的安全性带来了一定挑战。因此,利用公知的方法作种生成随机数位流序列有着被使用穷举种子正向生成随机数位流序列方法遭到破译的风险。
综上所述,如何为伪随机数生成函数(PRNG)提供统计指标随机且生成过程随机的离散伪随机数作为种子,使得生成的随机数位流序列与其在密码学方面的应用具有更强的抗正向破译能力,是本领域技术人员亟待解决的问题。
发明内容
为了改善以精确到秒的系统时间作为种子输入伪随机数生成函数(PRNG)带来的可能的安全问题,本发明公开了一种可用作种子的伪随机数的生成与相应唯一编码的生成方法,具体包括以下内容:提供了一种基于变频CPU的时钟周期和系统负载作为熵源的方法生成更加高分辨、离散且随机呈弱线性正相关的离散伪随机数,该伪随机数可在每一次或若干次重复调用伪随机数生成函数(PRNG)时刷新重设以作为即时的、可变的种子使用,以生成具有更强随机性质的随机数位流,用于密码学相关操作,提升在基于种子穷举正向爆破时密码系统的安全性。亦可作为盐(salt)在使用机器本体标识码与散列函数的随机唯一编码的生成中被使用,以生成性质优良的唯一编码。
在进一步阐述发明内容之前,首先对发明内容中所涉的关键名词进行如下界定和解释:
伪随机数的生成方法:使用算法确定性的产生具有统计随机特性的随机数。
统计随机特性:以数理统计方法衡量结果具有随机性、均匀分布等特性。
伪随机数生成函数(PRNG):任何生成不限位长伪随机数的算法,下文中一般指现存的伪随机数的生成算法。
伪随机数:是用确定性的算法计算出来均匀分布的随机数序列,下文中一般指使用本发明相关方法生成的伪随机数,亦为随机化后的以CPU时间计量的相对时间。
随机数位流:以二进制形式保存的随机数,满足伪随机数的全部特征,下文中一般指调用伪随机数生成函数(PRNG)后生成的随机数位流。
种子:作为伪随机数生成函数输入的参数,决定伪随机数生成函数输出结果的参数。
CPU累计时钟周期:CPU自使用初至某一时间节点下,CPU内部时钟工作的累计周期。
CPU基准频率:由CPU制造商标称的、公开且可获得的CPU的某一基本的、特定的工作频率。
休眠函数:任何使得进程暂时停止工作和运行的函数,包括但不限于std::sleep()函数。
线程挂起函数:任何使得线程暂时停止工作和运行的函数。
随机化后的以CPU时间计量的相对时间:随机、离散分布于真实的以CPU累计时钟周期等参数计量的CPU时间周围的一个值,是真实以CPU累计时钟周期等参数计量的CPU时间经过随机化后的值。
模运算取余:对一整数进行整除求余的数学计算过程,即计算A mod B的过程。
基于种子穷举正向爆破:通过穷举种子值,通过调用相应伪随机数生成函数(PRNG)与其他密码学操作期以生成与待求消息内容相同的消息内容,实现对消息内容的破译。
机器本体的标识码:标识执行程序的计算机硬件的不可变更的标识码,通常包括但不限于CPU序列号、硬盘序列号以及主板序列号等。
数组:用于计算机程序中,有限个类型相同的变量的集合命名,下文中一般指内容为字符等形式的数组。
散列函数:散列函数一般指哈希函数,指变长内容到定长内容映射的函数,下文中一般指密码学哈希函数。
为了实现上述目的,本发明所采用的技术方案是:
第一方面,本发明实施例提供一种离散的、弱线性正相关的伪随机数的生成方法,以解决现有种子以精确到秒的系统时间生成所产生的安全问题,所述的方法包括:
获取初始的CPU累计时钟周期C0,用于计算随机化后的以CPU时间计量的相对时间;
获取标称的CPU基准频率F,用于生成CPU离散浮动频率;
获取第一次精准计时结果T1;
获取第二次CPU累计时钟周期C1;
以std::sleep(0),即参数为0的形式调用休眠函数std::sleep()(或以类似方法调用线程挂起函数及其他休眠函数),期以系统实时负载和CPU核心利用情况为熵源,由随机短休眠带来随机效果产生;
获取第二次精准计时结果T2;
获取第三次CPU累计时钟周期C2;
由标称的CPU基准频率、两次精准计时差值、后两次CPU累计时钟周期差值生成CPU离散浮动频率,可采用如下公式:
进一步,对初始的CPU累计时钟周期与CPU离散浮动频率作商,得到随机化后的以CPU时间计量的相对时间;
经由以上一系列处理,可以获得以系统实时负载和多核心CPU核心利用情况为熵源、由随机短休眠带来的CPU离散浮动频率,将某一次CPU累计时钟周期与CPU离散浮动频率作商,即得到了随机化后以CPU时间计量的相对时间(离散的CPU运行时间数)。由于CPU的使用往往以微秒甚至纳秒计量,且CPU使用情况往往不完全受到用户控制,又由于CPU累计时钟周期递增的特性,随机化后的以CPU时间计量的相对时间是高分辨、离散且随机呈弱线性正相关的,是适宜作为种子的伪随机数。
第二方面,本发明实施例提供一种经由上述第一方面生成的伪随机数作为种子,调用伪随机数生成函数(PRNG)生成伪随机数的方法,以解决伪随机数生成函数(PRNG)种子与结果一一对应特性下生成过程不随机和易于被正向爆破的安全问题,所述的方法包括:
使用经由上述第一方面生成的随机化后的以CPU时间计量的相对时间的伪随机数作为种子,立即初设种子或在循环内刷新重设种子;
进入循环;
在每一次或若干次重复调用伪随机数生成函数(PRNG)前重新调用上述第一方面所涉的伪随机数获取函数获取伪随机数作为种子和种子重设函数以获取并应用新的种子,由刷新重设种子频次的差异,可以以质量或速度模式生成随机数;
一次调用伪随机数生成函数(PRNG),对获取到随机数对255模运算取余,经由强制转换以二进制流的形式,逐byte保存在保存数组中;
循环上述程序获取足够长度的随机数位流,保存在数组中,跳出程序;
由于不同随机过程中真熵源(系统实时负载和CPU核心利用与线程等待情况)的引入以及种子的多次刷新设置,输出的随机数不仅能够满足统计随机指标的要求,也同时满足了生成过程随机的要求,能够达到基于种子穷举正向爆破时更高的安全性的目的。
第三方面,本发明实施例提供一种经由上述第一方面生成的随机化后的以CPU时间计量的相对时间的伪随机数作为既成的伪随机数位流序列(由于没有使用伪随机数生成函数(PRNG),因此只能称之为伪随机数位流序列),结合机器本体标志码进行唯一编码的生成,以解决唯一编码生成源的选取问题,所述的方法包括:
获取必要的机器本体的标识码,包括但不限于CPU序列号、硬盘序列号以及主板序列号等;
进入循环;
刷新获取经由上述第一方面生成的伪随机数,是以CPU时间计量的相对时间;
首次循环时,将机器本体的标识码与以CPU时间计量的相对时间的离散伪随机数分别依次拷贝入数组Code中,并作为输入进行散列函数变换,获得哈希值,并保存在数组Code的最前端位置,对已有内容(拷贝入的机器本体标志码等)进行替换;
非首次循环时,将机器本体的标识码与以CPU时间计量的相对时间的离散伪随机数分别依次附加在数组Code现有的、上一轮循环获得的哈希值之后,将包括上一轮获得的哈希值与本次添加的内容一并作为输入(加盐的过程)进行散列函数变换,获得新一轮的哈希值,并保存在数组Code的最前端位置,对已有内容(上一轮的哈希值)进行替换;
循环上述程序,满足期望的散列变换轮次,跳出程序;
反复加入生成的伪随机数位流序列作为盐(salt)进行若干次散列函数变换,可以得到性质良好的定长编码。由于编码源来自于机器本体的标识码和呈现高分辨、离散且随机呈弱线性正相关的以CPU时间计量的相对时间生成的伪随机数,因此能够达到使唯一编码的生成具有机器唯一性和重复随机性的目的。
综上,本发明的实施例提供一种离散的、弱线性正相关的伪随机数的生成方法;一种经由上述第一方面生成的离散的、弱线性正相关的伪随机数作为种子,调用伪随机数生成函数(PRNG)生成随机数位流的方法;以及一种经由上述第一方面生成的离散的、弱线性正相关的伪随机数作为既成的伪随机数位流序列,结合机器本体标志码进行唯一编码的生成方法。
本发明的有益效果是,通过执行相关程序,可以使用真熵源作为输入参与伪随机数种子的生成,该伪随机数具有高分辨、离散且随机呈弱线性正相关的优良特性,适用于为伪随机数生成函数(PRNG)提供种子以调用伪随机数生成函数(PRNG)(如C++语言中的std::rand()函数)生成随机数位流。伪随机数同时可以用于唯一编码的生成,使得种子重设后的伪随机数生成函数(PRNG)输出的随机数位流不仅能够满足统计随机指标的要求,利用反复刷新种子的重复调用也同时满足了以固定种子输入的公知技术难以达到的生成过程随机的要求,能够达到基于种子穷举正向爆破时更高的安全性的目的;在运用于唯一编码生成时,唯一编码因机而异、因时而异,具有良好的随机性和唯一性。
经核心实验与统计检验,在主频为3799MHz,核心数为12,操作系统为Windows10built2020H2的机器上,使用本发明办法生成的伪随机数作为种子,种子结果在真实的CPU累计时钟周期附近随机分布,具有良好的离散型和弱正相关性,其相关系数为0.0264(见附图4),对比于公知方法获取的种子呈强线性分布,具有更加优良的离散型。
在相同的机器与环境下,以本发明办法生成的伪随机数作为种子,重设后,调用C++语言中std::rand()函数,生成的随机数位流序列较公知方法生成的随机数位流序列拥有更低的相关系数和更优良的随机统计随机程度,本发明方法下随机数位流序列相关系数约为6*10^-7,对比公知方法下随机数位流序列的2*10^-5(见附图5),本方法在统计随机程度方面较公知方法具有30倍以上的提升。虽然公知方法的离散程度仍然十分优秀,但在应用于精密和严格的领域,本发明方法所得结果具有更优良的特性。
在相同的机器与环境下,利用单线程对以一已知的32bits随机数位流进行随机字典正向破译(利用种子正向重生成相同的随机数位流为目标)以简单模拟正向暴力破解密码相关步骤的实验中,基于公知方法生成的随机数位流经历约46分钟(见附图6)得到了与之相同的随机数位流组,基于本发明办法(注:质量模式下)生成的随机数位流经历约173小时(见附图6)才得到了与之相同的随机数位流数组,可以初步说明正向暴力破解在本发明生成方法办法下受到了极大的阻碍。实验证明,以本发明办法生成的伪随机数作为种子生成的随机数位流具有更优良的生成过程随机性质,在防范基于种子穷举正向爆破时具有更高的安全性。
附图说明
为了更清楚的说明本发明采用的技术方案,下面结合附图进行进一步的说明。
显然,下面描述的一些附图仅是本发明的一些具体的实施例,对本领域普通技术人员来讲,在不付出创造性劳动的前提下,可以根据发明思想以及以下附图获得其他的附图。
图1是离散伪随机数生成的程序流程图;是基于本发明第一方面以及实施例一的实现流程图,展现了利用系统实时负载和多核心CPU核心利用与系统负载情况作为真熵源,通过与变频CPU累计时钟周期与CPU离散浮动频率相关的处理生成随机化后的以CPU时间计量的相对时间,即离散的、弱线性正相关的伪随机数(通常作为种子)的过程。
图2是利用生成的伪随机数调用伪随机数生成函数(PRNG)生成随机数位流的程序流程图;是基于本发明第二方面以及实施例二的实现流程图,展现了利用随机化后的以CPU时间计量的相对时间的伪随机数作为种子,并使用C++中的std::srand()、std::rand()函数生成随机数位流的过程。
图3是利用生成的伪随机数生成相应唯一编码程序流程图;是基于本发明第三方面以及实施例三的实现流程图,展现了利用随机化后的以CPU时间计量的相对时间种子、机器本体标志码以及散列函数生成唯一编码的过程。
图4是利用本发明方法生成的伪随机数作为种子与公知方法获取的种子在对照测试下种子性质的对比(图中上半为本发明方法,下半为公知方法);其中利用本发明生成的种子序列间的相关系数为0.0264,展现了本发明随机化后的以CPU时间计量的相对时间作为种子时具有比公知方法获取的种子拥有更高分辨、离散且随机呈弱线性正相关的性质,实现了公知方法难以做到的生成过程随机的目标。
图5是利用本发明方法生成的伪随机数作为种子与公知方法获取的种子在对照测试下作为std::srand()的参数,调用伪随机数生成函数(PRNG)生成的随机数位流的统计随机性质的对比(图中上半为本发明方法,下半为公知方法);其中利用本发明生成的随机数作为种子反馈调用随机函数std::rand()生成的随机数位流之间的相关系数约为6*10^-7,而利用公知方法生成种子作为反馈调用随机函数std::rand()生成的随机数位流之间的相关系数约为2*10^-5,展现了本发明方法生成的伪随机数作为种子调用伪随机数生成函数(PRNG)生成的随机数位流拥有比公知方法的生成结果更加优良的统计随机指标。
图6是利用本发明办法生成的随机数位流与以公知方法生成的随机数位流在随机暴力正向破译(利用种子正向重生成相同的随机数位流为目标)实验中遭到破译(重生成)花费时间的对照实验情况;其中利用本发明相关方法生成的随机数位流在622796秒(约173小时)后遭到破译,而利用公知方法生成的随机数位流在2601秒(约43分钟)后遭到破译,展现了利用本发明生成的伪随机数作为种子调用伪随机数生成函数(PRNG)生成的随机数位流在防范基于种子穷举正向爆破时具有更高的安全性。
具体实施方式
为了能够清晰地阐述本发明的目的、内部机理与实现过程,展现本发明的优势,下文中将结合本文附图对本发明的实施技术方案进行清楚、完整的表述。需要说明的是,所描述的实施例仅为本发明的一部分实施例,而不是全部实施例,基于本发明所描述的实施例,本领域的普通技术人员在无需创造性劳动的前提下所获得的所有实施例,都属于本发明的保护范围。
需要强调的是,以下所属具体实施方式中使用的伪代码计算机语言为C++语言,使用的操作系统为Windows系统,使用函数封装程序本体,因便于实现和表述所致,而不代表本发明保护的范围仅限于C++语言、Windows操作系统和以函数封装的实施例,在任何计算机语言、任何操作系统与任何形式下实现的基于本发明的任何实施例都属于本发明的保护范围。
具体实施方式的示例的内容将从三个不同的实施例针对离散伪随机数生成、利用离散伪随机数作为种子生成随机数位流以及利用生成的伪随机数生成相应唯一编码三个不同方面进行具体实施方式的具体阐述。
实施例一
据图1,在解决离散伪随机数生成问题上所采用的程序流程是:判断能否获取到CPU的相关信息,若能够获取,则正常调用接口函数Get_CPU_Time_Rand(),执行相关操作,否则返回错误信息。
接口函数的内部具体地实现了离散的伪随机数生成的过程,具体分为两个方面进行:其一,获取CPU累计时钟周期C0(UINT64型);其二,生成CPU离散浮动频率Ran_Freq(double型)。两个方面可以单线程依次进行,亦可多线程并发进行,不影响结果的有效特性。
获取CPU累计时钟周期,可以使用C++的汇编语言以简单的内联函数或C++2011标准支持的lambda函数实现,我们以内联函数汇编的形式为例:
调用函数Get_CPU_Cycle_Count(),函数的返回值即为所求的CPU累计时钟周期,以UINT64保存。由于如今CPU多核心和长寿命的特点,UINT64(又称unsigned long long)类型能够最大限度的完整保存数据。由其非负性,公知的形式如__int64(又称long long)或size_t等类型则不够完善,为进一步提升程序的严谨性和稳定性,避免可能的错误的发生,使用UINT64类型能够最大化的利用类型,且避免相关错误的发生。
生成CPU离散浮动频率,以Windows为例,接口函数内,程序严格地依次调用WindowsAPI中的QueryPerformanceFrequency()函数获取标称的CPU主频F,调用WindowsAPI中精确到微秒的精准时间计数函数QueryPerformanceCounter()获取计数时点T1,调用已经自定义的获取CPU累计时钟周期的函数Get_CPU_Cycle_Count()获取CPU累计时钟周期C1,然后以参数为0的方式调用休眠函数std::sleep(),即调用std::sleep(0)进行依赖于系统当前进程状况的伪随机延时,继续依次调用WindowsAPI中精确到微秒的精准时间计数函数QueryPerformanceCounter()获取计数时点T2,调用已经自定义的获取CPU累计时钟周期的函数Get_CPU_Cycle_Count()获取CPU累计时钟周期C2,至此,已经完成了所有的参数的获取工作,最后进行以下运算,即可获得以MHz测度的CPU离散浮动频率Ran_Freq:
其中Ran_Freq是以MHz为单位,基于标称主频F随机游走的一个随机量,经有限测验,使用主频为3799MHz的多核CPU在样本量为1.0*10^7的测试中以方差衡量的离散程度为21.425,离散程度与当前机器CPU使用率以及CPU核心数量有关。
获取CPU离散浮动频率的过程写作程序伪码,即:
QueryPerformanceFrequency(&F);//获取标称的CPU主频F
QueryPerformanceCounter(&T1);//获取计数时点T1
UINT64 C1=Get_CPU_Cycle_Count();//获取CPU累计时钟周期C1
std::Sleep(0);//调用休眠函数
QueryPerformanceCounter(&T2);//获取计数时点T2
UINT64 C2=Get_CPU_Cycle_Count();//获取CPU累计时钟周期C2
double Ran_Freq=((C2-C1)*F)/((T2-T1)*1000000);//计算出以MHz测度的CPU离散浮动频率
需要特殊说明的是,进行伪随机休眠的std::Sleep(0)在公知的方法和其他部分用途中可能易成为不正确的调用方式,仅在本发明的用途和方法下能够达到目标效果。std::Sleep()通常需要一个以毫秒计时的正整数作为参数,在内核中,std::Sleep()的实现是由pause函数和alarm函数实现的,本质是通过等待条件在线程队列中让线程在条件达成之前进入休眠。由于正常运行中的操作系统有大量后台挂起的进程和线程共享CPU的处理能力,因此,当对std::Sleep()传入0为参数时,在理想化、无后台其他进程、CPU处理能力完全富裕、内存读写无延时或延时完全固定的情况下,调用该函数后,线程会立即进入休眠,然后立即解除休眠,调用函数对程序运行时间的影响(即延时作用的影响)是固定的,取决于执行该函数本身以及内部实现在机器上调用所消耗的时间;但在现实运用中,由于操作系统相关进程和其他后台挂起进程的存在、CPU处理能力相对稀缺、内存读写具有延时且延时不固定,即使调用函数本身对程序运行时间的理想化影响是不变的,由于争抢线程、各种时延等随机因素的作用,线程立即进入休眠然后立即解除休眠的过程在多次重复中仍然可能消耗随机不等的时间,即使影响微乎其微,但由于用于计量时延的CPU累计时钟周期具有极高的分辨率,微乎其微的影响在测算CPU离散浮动频率和最后的作商时经过放大,导致了伪随机休眠现象的产生以及CPU离散浮动频率的产生,std::Sleep(0)在此时能够达到目标效果。
离散伪随机数生成的最后一步,就是将获取到的CPU累计时钟周期C0与CPU离散浮动频率Ran_Freq作商,即可获得随机化后的以CPU时间计量的相对时间Ran_Rela_Time:
最后,返回所得结果即为所求的伪随机数。
实施例二
据图2,在解决利用离散伪随机数作为种子生成随机数位流问题上所采用的程序流程是:调用接口函数Get_Rand_PRNG(…),函数内,程序判断所选择的模式,并根据选择模式对初设(或刷新)种子、调用随机函数取余赋值的操作进行不同顺序的循环。
接口函数的内部根据所选择的模式采用了不同的顺序调用,以下依次就质量模式和速度模式的程序流程展开阐述。
调用接口函数后,若传参判断为质量模式,则进入生成循环。当循环次数小于等于需要长度(以byte计)时,每次重复调用Get_CPU_Cycle_Count()作为std::srand()的参数刷新种子,即每次循环调用时使用std::srand(Get_CPU_Cycle_Count())重设种子,然后调用一次std::rand()以当前刷新后的种子为反馈源进行一次伪随机数生成,以unsignedint形式转化为8位二进制位流直接赋值给随机数位流数组的一个元素random_stream[i](unsigned char),强制转换的过程中进行了对255的模运算取余,得到8bits(1byte)的随机数位流;当循环次数大于需要长度时,跳出循环,random_stream即是生成的随机数位流。
质量模式下利用离散种子生成随机数位流的过程写作程序伪码,即:
需要特殊说明的是,质量模式区别于速度模式的部分在于刷新种子与循环体的位置关系。在质量模式下,每一byte位流最终随机数的生成依赖于每一次种子的刷新重设,因此,即便是伪随机数生成函数(PRNG)std::rand()依靠固定规则生成随机数,而每一次获得随机化后的以CPU时间计量的相对时间的种子的过程可以被证明是一次真随机的调用(由于真熵源的引入)。因此,即便是种子与std::rand()生成的第一个随机数被认为是一一对应的,重复调用Get_CPU_Cycle_Count()刷新种子的过程与结果本身是随机的,因此,最终生成的随机数位流与种子拥有一致的随机特性(并被证明比公知方法更加统计随机)。而被称为质量模式,在于种子刷新的次数更多,因此,一一对应的映射环节相较更少,随机数位流的结果更依赖于随机种子生成的过程而不是调用std::rand()生成的过程(故:要基于种子获得对应的随机数位流,必须同时破解出所有的种子值,指数级地提高了正向破译的复杂度),生成的随机数位流拥有更优良的性质,同时需要更大量的运算以及消耗更长的运算时间。
此外,由于密码学操作中对随机数的需求通常是以二进制位流(bits stream)的形式,因此若需要得到二进制位流的随机结果,需要将std::rand()返回的unsigned int型的值转化为二进制位流的形式。本发明采用的技术手段是对unsigned int型的返回值对255作模运算取余,按位转化为8位二进制位流的形式保存在unsigned char*的数组中的一个元素里。巧妙地利用了强制转换的方式,容易实现以上操作。此处作模运算取余的过程并未改变期望均匀分布的随机数变为位流后随机的性质,强制转换为位流后的随机数位流仍然具有良好的统计随机特性。
调用接口函数后,若传参判断为速度模式,则一次调用Get_CPU_Cycle_Count()作为std::srand()的参数初设本次全部操作的固定种子,然后进入生成循环。当循环次数小于等于需要长度(以byte计)时,重复调用std::rand()进行一次随机数生成,以unsignedint形式转化为8位二进制位流直接赋值给随机数位流数组的一个元素random_stream[i](unsigned char),强制转换的过程中进行了对255的模运算取余,得到8bits(1byte)的随机数位流;当循环次数大于需要长度时,跳出循环,random_stream即是生成的随机数位流。
速度模式下利用离散种子生成随机数位流的过程写作程序伪码,即:
同样需要特殊说明的是,速度模式区别于质量模式的部分在于初设种子与循环体的位置关系。在速度模式下,所有bytes需要的最终随机数位流的生成依赖于最初的一次种子的初设,即最终随机数位流的生成依赖于最初的种子映射下伪随机数生成函数(PRNG)std::rand()的固定规则,而最初获得随机化后的以CPU时间计量的相对时间的种子的过程可以被证明是一次真随机的调用(由于真熵源的引入)。因此,即便是种子与std::rand()每一次生成的随机数位流被认为是一一对应的,在密码学的一次操作中可能需要多组随机数位流,从而会多次调用函数初设种子并依赖本次种子生成随机数位流。因此,在实际密码学操作中生成的生成随机数位流序列是满足统计随机的(并被证明比公知方法更加统计随机)。而被称为速度模式,在于种子刷新的次数更少,所有的随机数位流生成依赖于伪随机数生成函数(PRNG)的调用,因此,一一对应的映射环节相较更多,随机数位流的结果更依赖于调用std::rand()生成的过程而不是随机种子生成的过程,生成的随机数位流较质量模式拥有略差的性质(经实测,以相关系数衡量的随机性是质量模式的1.7倍左右,即性质约达到质量模式的59%),不过需要更少的运算以及消耗更短的运算时间。
由随机数转化为二进制位流的相关技术手段与质量模式采用手段类同,参见上文。
实施例三
据图3,在解决利用生成的伪随机数生成相应唯一编码问题上所采用的程序流程是:调用接口函数Generate_Unique_Code(…),函数内,程序初始化一空unsigned char型数组Code,然后获取机器本体标志码,包括处理器序列号CPU_ID、硬盘序列号DISK_SN以及主板序列号BOARD_ID,然后进入操作循环。当循环次数小于等于特定循环次数时,依次将处理器序列号CPU_ID、硬盘序列号DISK_SN以及主板序列号BOARD_ID附加在数组Code现有内容之后(首次循环,数组为空,则从头附加),然后调用Get_CPU_Cycle_Count(),将返回的随机化后的以CPU时间计量的相对时间附加在数组Code现有内容之后,调用散列函数进行散列变换,将哈希值从头([0]开始)写入Code,并在哈希值的结尾写入\0,循环次数自增;当循环次数大于特定循环次数时,跳出循环,Code则是最终生成的唯一编码。
本发明在获取机器本体标识码的过程均采用公知的方法,具体流程因操作系统而异。以Windows下获取CPU_ID为例,获取制式化32bytes定长序列号可以采用汇编的方法经由unsigned long强制转换为每8bytes,分次获得:
//分别对str1和str2利用%08X强制转换为16进制过程略
将内容附加在数组Code现有内容之后的过程可以使用公知的C++中的string::strcat()函数实现。最初一次循环时,Code为空,则新的内容从头附加;在进行散列函数变换之后,Code的前若干bytes已由上一轮散列函数运算的哈希值填充,因此,新的内容应当附加在上一次循环生成的哈希值之后,即作为上一次循环生成的哈希值的盐(salt),与上一次循环的哈希值一并作为本次循环参与散列函数运算的输入内容,生成本次散列函数运算的哈希值。
对散列函数的选取一般也采用公知的方法,推荐采用位流更长、更加安全的密码学散列函数,如SHA-2,SHA-3等。
利用生成的伪随机数生成相应唯一编码的过程写作程序伪码,即:
/>
需要特殊说明的是,由于机器本体标识码因机而异,而在循环调用Get_CPU_Cycle_Count()生成伪随机数的过程又因时而异,因此,将机器本体标识码和由Get_CPU_Cycle_Count()生成随机化后的以CPU时间计量的相对时间作为初始内容或盐(salt)累次获得的哈希值亦是因机而异且因时而异的,又由散列函数本身输出均匀分布且随机的特性,保证了唯一编码结果的随机性和唯一性。
最后应当重申的是,上述实现方式仅是本发明的一种较佳实施示例以及所利用的具体技术原理,本发明不限于上述的实施示例以及上述核心方法的实现形式,对本领域内普通技术人员在不进行创造性劳动下可能产生的明显变化、调整、替代与合理的增删不会脱离本发明的保护范围。因此,虽然以上示例对本发明在C++的环境下的具体实施做了十分详尽的说明,但是在不脱离本发明构思的情况下的任何环境下、任何形式的任何实施例都属于本发明的保护范围。本发明的保护范围由所附的权利要求决定。

Claims (5)

1.一种伪随机数生成方法,其特征在于,所述方法包括:
获取CPU累计时钟周期;
以系统实时负载和CPU核心利用情况为熵源,通过以休眠时间参数为0的形式调用线程挂起函数带来随机效果,并使用CPU基准频率F、精准计时结果T1、T2、CPU累计时钟周期C1、C2生成CPU离散浮动频率,所述生成CPU离散浮动频率的方法包括:
获取标称的CPU基准频率F;
获取一次精准计时结果T1;
获取一次CPU累计时钟周期C1;
以休眠时间参数为0的形式调用线程挂起函数,期以系统实时负载和CPU核心利用情况为熵源,由随机短休眠带来随机效果产生;
再次获取精准计时结果T2;
再次获取CPU累计时钟周期C2;
由标称的CPU基准频率、两次精准计时差值、两次CPU累计时钟周期差值,可采用如下公式:
生成CPU离散浮动频率;
通过将CPU累计时钟周期与CPU离散浮动频率作商以生成伪随机数。
2.一种调用伪随机数生成函数PRNG生成伪随机数位流的方法,其特征在于,所述方法包括:
使用权利要求1所述的伪随机数生成方法生成离散的伪随机数,作为调用伪随机数生成函数PRNG的种子;在每一次或若干次重复调用伪随机数生成函数PRNG前,使用权利要求1所述的伪随机数生成方法生成离散的伪随机数作为调用伪随机数生成函数PRNG的种子,并调用伪随机数生成函数PRNG;
以伪随机数生成函数PRNG最终生成的随机数作为期以生成的随机数,并处理成位流形式,作为生成的伪随机数位流。
3.根据权利要求2所述的调用伪随机数生成函数PRNG生成伪随机数位流的方法,其特征在于,使用权利要求1所述的伪随机数生成方法生成离散的伪随机数作为种子,以及运用该种子调用伪随机数生成函数PRNG的生成伪随机数位流方法包括:
进入循环;
在每一次或若干次重复调用伪随机数生成函数PRNG前重新使用权利要求1所述的伪随机数生成方法生成离散的伪随机数作为种子,并为伪随机数生成函数PRNG刷新设定种子;
一次调用伪随机数生成函数PRNG,将生成的伪随机数处理成位流形式;
刷新循环变量并重复循环,直到满足长度需求,跳出循环。
4.根据权利要求2所述的调用伪随机数生成函数PRNG生成伪随机数位流的方法,其特征在于,将生成的随机数处理成位流形式的方法包括:对获取到的随机数对255进行模运算取余,经由强制转换方法使其成为二进制流的形式,逐byte保存在保存数组中,作为伪随机数位流的部分。
5.一种唯一编码生成的方法,其特征在于,所述方法包括:
获取必要的机器本体的标识码,包括CPU序列号、硬盘序列号以及主板序列号的机器本体的标识码;
进入循环;
刷新获取经由使用权利要求1所述的伪随机数生成方法生成离散的伪随机数;
首次循环时,将机器本体的标识码与离散伪随机数分别依次拷贝入数组Code中,并作为输入进行散列函数变换,获得哈希值,并保存在数组Code的最前端位置,对此前拷贝进入数组Code中的机器本体标志码进行替换;
非首次循环时,将机器本体的标识码与离散伪随机数分别依次附加在数组Code现有的、上一轮循环获得的哈希值之后,将包括上一轮获得的哈希值与本次添加的内容一并作为输入内容进行散列函数变换,获得新一轮的哈希值,并保存在数组Code的最前端位置,对数组Code中的上一轮的哈希值进行替换;
刷新循环变量并重复循环,直到满足期望的散列变换轮次,跳出循环;
经过最终轮的散列变换,Code中的内容即是生成的唯一编码。
CN202110865376.9A 2021-07-29 2021-07-29 可用作种子的伪随机数的生成与相应唯一编码的生成方法 Active CN113556228B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202110865376.9A CN113556228B (zh) 2021-07-29 2021-07-29 可用作种子的伪随机数的生成与相应唯一编码的生成方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202110865376.9A CN113556228B (zh) 2021-07-29 2021-07-29 可用作种子的伪随机数的生成与相应唯一编码的生成方法

Publications (2)

Publication Number Publication Date
CN113556228A CN113556228A (zh) 2021-10-26
CN113556228B true CN113556228B (zh) 2024-01-12

Family

ID=78133360

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202110865376.9A Active CN113556228B (zh) 2021-07-29 2021-07-29 可用作种子的伪随机数的生成与相应唯一编码的生成方法

Country Status (1)

Country Link
CN (1) CN113556228B (zh)

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN115174261A (zh) * 2022-08-02 2022-10-11 黄博暄 基于分阶划层与密中密分发的混合加密解密系统与方法

Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6282181B1 (en) * 1998-04-24 2001-08-28 Ericsson Inc Pseudorandom number sequence generation in radiocommunication systems
EP1361507A2 (en) * 1996-05-13 2003-11-12 Micron Technology, Inc. Pseudo-random number generator with low power mode
CN102084336A (zh) * 2008-07-07 2011-06-01 通用仪表公司 伪随机数生成器种子的自适应生成
CN106648543A (zh) * 2016-12-29 2017-05-10 北京握奇智能科技有限公司 一种随机数生成方法及装置
CN107769923A (zh) * 2016-08-23 2018-03-06 中国科学院声学研究所 一种基于cpu时钟和usb独立时钟的真随机数产生方法

Family Cites Families (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8255443B2 (en) * 2008-06-03 2012-08-28 International Business Machines Corporation Execution unit with inline pseudorandom number generator
US9891889B2 (en) * 2016-06-30 2018-02-13 International Business Machines Corporation Injecting CPU time jitter to improve entropy quality for random number generator

Patent Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
EP1361507A2 (en) * 1996-05-13 2003-11-12 Micron Technology, Inc. Pseudo-random number generator with low power mode
US6282181B1 (en) * 1998-04-24 2001-08-28 Ericsson Inc Pseudorandom number sequence generation in radiocommunication systems
CN102084336A (zh) * 2008-07-07 2011-06-01 通用仪表公司 伪随机数生成器种子的自适应生成
CN107769923A (zh) * 2016-08-23 2018-03-06 中国科学院声学研究所 一种基于cpu时钟和usb独立时钟的真随机数产生方法
CN106648543A (zh) * 2016-12-29 2017-05-10 北京握奇智能科技有限公司 一种随机数生成方法及装置

Also Published As

Publication number Publication date
CN113556228A (zh) 2021-10-26

Similar Documents

Publication Publication Date Title
US6076097A (en) System and method for generating random numbers
CN113556228B (zh) 可用作种子的伪随机数的生成与相应唯一编码的生成方法
US20140136584A1 (en) Method and Apparatus for Generating Random Numbers
US7233965B2 (en) Continuous random number generation method and apparatus
L'Ecuyer et al. Multiple streams with recurrence-based, counter-based, and splittable random number generators
AU2021200063A1 (en) Systems and computer-implemented methods for generating pseudo random numbers
CN107769923A (zh) 一种基于cpu时钟和usb独立时钟的真随机数产生方法
Acevedo et al. On the computation of LFSR characteristic polynomials for built-in deterministic test pattern generation
Stipčević Fast nondeterministic random bit generator based on weakly correlated physical events
TWI801742B (zh) 熵產生器及產生增強熵的方法
Chan et al. True random number generator using GPUs and histogram equalization techniques
CN108872902A (zh) 波形输出方法和装置
JP2006318475A (ja) 処理及び記憶能力に制限のある装置における乱数分布発生システム及び方法
Monfared et al. BSRNG: a high throughput parallel bitsliced approach for random number generators
L'Écuyer et al. Random numbers for parallel computers: Requirements and methods, with emphasis on gpus
CN112580077B (zh) 一种信息处理方法、装置、设备及存储介质
Coddington et al. Japara-a java parallel random number generator library for high-performance computing
CN111478707B (zh) 一种随机置乱的确定性压缩感知测量装置及方法
EP1081591A2 (en) Random number generator
CN116301724B (zh) 一种不重复伪随机数的生成方法、装置、设备及存储介质
US20230315327A1 (en) Software-based entropy source based on dram access latencies
Antonov Random number generator based on multiplicative convolution transform
Ramesh et al. SRAM based random number generator for non-repeating pattern generation
CN113821442B (zh) 基于正态分布的压力测试方法、系统、终端及存储介质
CN111913798B (zh) 一种基于cuda的快速非重叠模板匹配计算方法

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant