密码学工具6——随机数生成器(PRNG,TRNG设计最全版)

随机数应用

随机数与密码学是密切相关的,基于前文的AES算法中就多次提及了随机数,所以本文针对随机数技术做个详细的整理。

随机数在以下场景中使用:

  • 密钥(对称密码和消息认证码)生成
  • 密钥对(公钥密码和数字签名)生成
  • 初始化向量(IV)生成
  • NONCE码(AES-CTR模式中生成计数器初值)生成
  • 盐码(应用于口令密码PBE)生成

随机数性质

随机数有以下三个性质,通常通过这个三个性质对随机数的质量进行判断

  • 随机性——不存在统计学偏差,是完成杂乱的数列
  • 不可预测性——不能从过去的数列推测出下一个出现的数
  • 不可重现性——除非将数列本身保存下来,否则不能重现相同的数列

随机性

随机性指的是一串十字看上去杂乱无章的性质,如果一串随机数列中不存在统计学偏差,则可认为这串数列是随机的,满足随机性的随机数列称为弱伪随机数,不可应用于密码算法

不可预测性

随机性对密码算法中使用的随机数来说是不够用的,至少需要具备不可预测性(unpredictability),是指攻击者在知道过去生成的伪随机数列的前提下,依然无法预测下一个生成出来随机数的性质,满足随机性和不可预测性的随机数称为强伪随机数可应用于密码算法

不可重现性

不可重现性,是指无法重现和某一随机数列完全相同数列的性质。具备不可重现性的随机数称为真随机数可应用与密码算法

仅靠软件是无法生成具备不可重现性的随机数列的。软件只能生成伪随机数,因为运行软件的计算机本身仅具备有限的内部状态,所以内部状态相同,软件只能生成相同的数,所以迟早会复现一个相同的数。

要生成具备不可重现性的随机数列,需要从不可重现的物理现象中获取信息,比如周围的温度和声音的变化,用户移动的鼠标的位置信息、键盘输入的时间间隔,放射线测量仪输出值等,根据硬件中所获取的信息而生成的数列,一般可以认为是具备不可重现性的随机数列。目前已经开发除了可以生成不可重现随机数列的硬件设备。

随机数生成器

随机数可以通过硬件来生成,也可以通过软件来生成,根据之前的描述,软件可实现的是伪随机数生成器(Pseudo Random Number Generator,PRNG),硬件可实现的是随机数生成器(Random Number Generator,RNG)。在芯片中使用的随机数生成器都是指硬件随机数生成器。

伪随机数生成器(PRNG)

伪随机数生成器具有内部状态,根据外部输入的种子来生成随机数序列。

伪随机数生成器的内部状态,是指伪随机数生成器管理的内存中的数值,当有请求传入时,伪随机数生成器根据内存中的值进行计算,将计算结果作为输出,这种根据内部状态计算伪随机数的方法和改变内部状态的方法结合起来,就是伪随机数生成算法。

伪随机数的粽子用来对伪随机数生成器内部的状态进行初始化,种子是一串随机的比特序列,根据种子可以生出专属的伪随机数列,一般伪随机生成器是公开的,但是种子必须是保密的

实现伪随机数生成器有以下方法

  • 线性同余法
  • 单向散列函数法
  • 密码法
  • ANSI X9.17

线性同余法

线性同余法,Linear congureential method,在实际中使用非常广泛,但是该方法生成的伪随机数不可以用于密码算法

R0=(A*seed+C) mod M

Rn=(A*Rn-1+C) mod M

线性同余法是将房钱的伪随机数乘以A再加上C,然后除以M得到余数作为下一个伪随机数

由于算法简单,需要谨慎选择A、C和M的值,不然容易产生不具备随机性的随机数列,即使算法输出具备随机性,但是无法实现不可预测性(算法输出会有周期性),所以不能用于密码技术。


C语言的库函数rand,JAVA的Random都是使用了线性同余法


单向散列函数

单向散列函数(如SHA-1)编写的伪随机生成器可以输出不可预测性的伪随机数列,单向散列函数的单向性是支撑伪随机数不可预测性的基础

用伪随机数的种子初始化内部计数器,用单向散列函数计算计数器的散列值,将散列数作为伪随机数输出,之后随机数值加1,作为下一次随机数计算的基础。

密码法

一般基于密码法的伪随机数生成器,一般使用的是AES等duichen密码算法,也可以使用RSA等公钥密码。基于密码法伪随机数生成器,密码的机密性是支撑伪随机数生成器不可预测性的基础。

密码法的随机数生成器需要在开始阶段,同时输入Seed用于初始化内部状态计数器和将秘钥加载至加密算法,将加密算法的输出作为伪随机数。

ANSI X9.17

ANSI X9.17中使用了三重DES和AES作为密码算法,基于ANSI X9.17的伪随机数生成器结构如下图

与常规密码随机生成器不同,该方法增加了掩码步骤,因此随机数质量会更高。

PRNG硬件设计

在芯片硬件中中,PRNG模块也称DRNG(Deterministuc random numer)模块,根据前文的概念,PRNG需要种子进行伪随机数的生成,种子一般可以由用户写入或者使用TRNG(真随机数模块,见后文章节描述)模块的输入写入,再经过内部章台模块处理后得到伪随机数列。

PRNG模块中内部状态最常见的是使用LSFR(线性反馈移位寄存器)实现,也可以使用线性同余法等,根据实际伪随机数的安全要求及使用场景进行确定。伪随机数的使用场景一般用于安全需求不高的应用场景。

真实随机数生成器(TRNG)

在前文有提及,想要实现真随机数需要使用一些物理现象来产生随机数,由于这种行为收到多个自然因素影响,过程不可预测,所以任务是安全的。

TRNG是安全芯片中常见的模块,TRNG中包含随机源模块,采样模块,数字后处理模块,如下图所示。

随机源设计

芯片中TRNG中随机源的核心是由多个反相器(必须是奇数个)组成的环形震荡器,环形震荡器的特点是没有稳态,因为任何一个反相器的输入和输出不可能稳定在高电平或低电平,只能处于高、低电平之间,处于放大状态。当环形振荡器中的某个反相器产生微小的正跳变时,经过一系列的传输延迟后,会在输出端产生自激振荡,形成周期性的振荡信号‌。

如上图,使用D触发器作为环形震荡器的采样开关,高频环形震荡器的信号作为输入,低频时钟信号作为采样时钟信号,使用采样时钟的上升沿对输入信号进行采样。震荡器存在相位噪声使得采样具有随机性,理想情况下,该相位噪声是晶体管热噪声的复产物,通过利用噪声的随机性进而产生随机序列。

在TRNG模块中会有多个随机源,每个随机源经采样后会输出1比特数据,如果多路随机源都开启,多路随机数据会经异或处理后输出1比特输出至数字后处理模块进行处理。

数字后处理设计

TRNG模块中数字后处理模块一般采用线性反馈移位寄存器(LFSR),也称作M序列扰乱模块。

线性反馈移位寄存器

移位寄存器是指若干个寄存器排成一列,每个寄存器中存放1bit二进制数据(0或1),每个时钟,移位寄存器向右移动一位,则移位寄存器的左左侧就会空出一位。这个如果左侧有输入,则移位寄存器的右侧输出端则会有源源不断的数据输出。

线性反馈寄移位寄存器的反馈函数一般是将寄存器中的某些位进行异或,将反馈函数得到的计算结果反馈到移位寄存器的最左边作为数据的输入。

LSFR都会有一个特征多项式:

式中Ci表示是否抽头,抽头就是指LSFR中该位的数据是否在反馈函数中参与异或处理。

注:需要注意LSFR中的值不能是全零,如果为全零的话,下次经反馈函数异或后还是0,LSF的状态永远不发改变了

经LSFR数字处理后的随机数列,就是TRNG模块输出的随机数序列。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值