打印
[STM32F7]

NUCLEO-F722ZE+随机数生成器的NIST测试

[复制链接]
3731|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 zhanzr21 于 2017-3-14 17:27 编辑

关心安全应用的程序员应该比较关心随机数生成器的随机性.STM32F7的随机数生成器号称真随机数生成器,这里使用NIST的测试案例套件SP 800-22rev1a对其进行验证测试.

1.随机数生成器配置及简介
随机数生成器在加解密的应用中使用较多,一般而言有两种随机数生成器:
1.PRNG(伪随机数生成器)
即用特定的种子与算法来生成随机数,比如C Library中的rand实现.因为算法是公开的,所以只要知道种子,生成的数字完全可以预料到.这种生成器的关键在于种子的来源,一般要使用另一个TRNG来生成种子才能满足安全应用的需求.
2.TRNG(真随机数生成器)
利用不可预见的因素来生成随机数,比如宇宙射线,热噪音.STM32F7上集成的生成器属于这一种.虽然严格意义上的真随机数生成器不可能存在,但是可以尽量接近这一目标.
以下是ST的产品线中集成有随机数生成器的列表(截止发贴,有可能不完全)

  产品线  
子系列
  F2  
STM32F2x5
  STM32F2x7
  F4  
STM32F405/415
  STM32F407/417
  STM32F410
  STM32F427/437
  STM32F429/439
  STM32F469/479
  F7  
STM32F7x2  STM32F7x5
  STM32F7x6
  L0  
STM32L05x
  STM32L06x
  STM32L072/073
  L4  
STM32L4x6

STM32产品中的随机数生成器由纯硬件实现,原理大致如下:

F722,TRNG的时钟为专门的固定的一个时钟源,只有激活与非激活两种状态,除中断外无参数可配.

这样就打开了.

无参数可以配置.
生成的工程中这样就能获取TRNG的输出:
            
 tmpRng = HAL_RNG_GetRandomNumber(&hrng);

             printf("%u\n", tmpRng);

附件都在这里以供参考:
PC程序+代码+样本: sts-2.1.2_包含样本_测试程序.zip (42.13 MB)
STM32F722工程含Cube工程: f722_t1_trng_nist.zip (13.31 MB)

沙发
zhanzr21|  楼主 | 2017-3-14 17:15 | 只看该作者
2.随机数测试套件简介及配置
生成了随机数之后,需要验证其是否符合安全应用的标准.NIST是美国国家的一个专门关注安全类标准的机构,这里使用NIST的一个测试案例套件NIST SP800-22b来对生成的随机数来对生成的结结果来验证与评估一下.关于这个标准的详情,可以参考这篇论文:
A Statistical Test Suite for the Validation of Random Number Generators and Pseudo Random Number Generators for Cryptographic Applications
这个套件是一个C语言写成的函数集合,下载地址:
http://csrc.nist.gov/groups/ST/toolkit/rng/documents/sts-2.1.2.zip
一共有15组测试,可以分为如下几类:
1.频率测试
测试0与1出现的频率,简单讲01在生成的随机数样本中应该接近于1/2,分布也应该接近于均匀分布.
2.线性度测试
·       2.1 测试32x32的二进制矩阵的秩,
·       2.2 测试有限序列的线性复杂度
3.相关度测试
这个测试使用FFT变换的方法来测试.
使用离散FFT算法来测试位串在整个样本中出现的频谱.
4.特殊串测试
测试某些特殊串出现的(周期性)频率与(非周期性)模式.
5.熵值测试
测试某个长度的位串的可压缩性.
6.遍历测试
测试某个子串在整个串中的累计和(不能太大也不能太小).
以上的测试最终会得出一个结果: P
P值的数学意义是一个完美随机数生成器生成一个随机度低于被测试样本生成器的概率.
关于此测试套件的更详细的说明请参考NIST网站上的这篇**:
“A Statistical Test Suite forRandom and Pseudorandom Number Generators for Cryptographic Applications” Special Publication 800-22 Revision 1a.
下载了上述的套件后,解压,编译出可执行文件来.
本人使用的Cygwin,MSYS应该也可以,Linux当然更好.
直接make即可.


如果没有cygwin或者类似环境,可以使用ST官方发布的windows下编译好的exe(见最后的部分附件).

使用特权

评论回复
板凳
zhanzr21|  楼主 | 2017-3-14 17:17 | 只看该作者
3.生成随机数
这里一共生成512000bit的随机数,word计是16000 word.可以使用两种格式来保存.
3.1 ASCII格式
就是一个byte转成ASCII格式保存,比如0x55表示为0x30,0x31,0x30,0x31,0x30,0x31,0x30,0x31. 这种格式传输与保存要用8倍于binary格式.但是读取起来要块一点.
3.2 Binary格式
直接原始格式.
本实验使用binary格式(%c格式).通过串口或者SWO发送上电脑存为python脚本在将数据存为binary文件再进行测试.
主要代码如下:
printf("python_array = [\n");
        for(i=0; i<TEST_WORD_NUM; ++i)
        {
                tmpRng = HAL_RNG_GetRandomNumber(&hrng);

                printf("0x%02X, 0x%02X, 0x%02X, 0x%02X, ",
                tmpRng & 0xFF,
                tmpRng >>8 & 0xFF,
                tmpRng >>16 & 0xFF,
                tmpRng >>24 & 0xFF);
        }
        printf("]\n");
        printf("f=open('test_f722_random.bin',mode='wb')\n");
        printf("print(len(python_array))\n");
        printf("f.write(bytearray(python_array))\n");
        printf("f.close()\n");
运行:
看输出

完成整个输出要一分钟左右,请耐心等候.
将输出拷贝出来存为python文件:

使用Python运行该脚本(注意脚本过大用IDLE运行一定会很卡,要用命令行来运行),生成test_f722_random.bin.

全部代码见最后部分的附件.



使用特权

评论回复
地板
zhanzr21|  楼主 | 2017-3-14 17:20 | 只看该作者
4.最终测试
运行程序, test_f722_random.bin放在assess.exe相同的目录(放哪里都行,这里只是为了方便).运行assess.exe.


这里参数为最终数据位数的10分之一,因为整个数据是分为10个block来的.0输入数据文件名,回车后显示测试选项,按1进行所有测试.

之后可以调整参数, 这里全部使用默认参数,0.再选择block数目,这里选10:

最后选格式,这里选择1,binary格式.

于是开始分析计算了,

到这里算是分析完了:


结果都在这个目录里面:

看看最终的总报告:

对于除了random excursion测试的项目,一般而言得分过算是Pass.当然越高越好.还有分项测试的实验报告在各个目录里面.至于如何详细分析这些报告,属于大家的统计学基础了.这里不多展开了.为求对比,这里再用NewLibrand()函数生成一个同样大小的sample进行测试.需要注意的是clib中的rand()函数都为PRNG,即算法生成的伪随机数生成器.生成的C代码如下,使用cygwin gcc 5.4.0 + newlib编译.
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <time.h>

#define TEST_RANDOM_WORD_NUM        16000

int main(void)
{               
        uint32_t tmpRng;
       
        FILE* fp = fopen("test_newlib.bin", "wb");
        for(int i = 0; i<TEST_RANDOM_WORD_NUM; ++i)
        {
                tmpRng = rand();
                fwrite(&tmpRng, 1, 4, fp);
        }
        fclose(fp);
       
        return 0;
}
结果在附件中,可以比较一下子,简单而言STM32F7TRNG性能要好很多.
分享至此结束,多谢!
为求方便,决定将附件都移动到最上层分享.

使用特权

评论回复
5
wahahaheihei| | 2017-3-14 19:16 | 只看该作者
随机数的原理是什么呢?是不是不同的硬件,生成随机数的原理不tong.

使用特权

评论回复
6
zhanzr21|  楼主 | 2017-3-14 19:19 | 只看该作者
wahahaheihei 发表于 2017-3-14 19:16
随机数的原理是什么呢?是不是不同的硬件,生成随机数的原理不tong.

同学,你没有认真看我的贴子:

1.随机数生成器配置及简介
随机数生成器在加解密的应用中使用较多,一般而言有两种随机数生成器:
1.PRNG(伪随机数生成器)
即用特定的种子与算法来生成随机数,比如C Library中的rand实现.因为算法是公开的,所以只要知道种子,生成的数字完全可以预料到.这种生成器的关键在于种子的来源,一般要使用另一个TRNG来生成种子才能满足安全应用的需求.
2.TRNG(真随机数生成器)
利用不可预见的因素来生成随机数,比如宇宙射线,热噪音.STM32F7上集成的生成器属于这一种.虽然严格意义上的真随机数生成器不可能存在,但是可以尽量接近这一目标.

使用特权

评论回复
7
wahahaheihei| | 2017-3-14 19:25 | 只看该作者
看了,我的意思是不是别的单片机调用C LIB这个rand函数后,可能背后的原理跟这个不同?

使用特权

评论回复
8
zhanzr21|  楼主 | 2017-3-14 19:37 | 只看该作者
wahahaheihei 发表于 2017-3-14 19:25
看了,我的意思是不是别的单片机调用C LIB这个rand函数后,可能背后的原理跟这个不同? ...

你没有仔细看
我的贴子的是评测STM32F722的TRNG,
也就是真随机数发生器,
这个是基于硬件的热燥音来产生随机数的,
而CLib的rand()函数是PRNG,伪随机数, 是由算法来产生随机数的,
CLib的rand()函数的算法由CLib实现, 不同编译器使用不同算法,
如果使用相同算法,相同种子,那么结果是可以预料的,
这也是CLib的rand()函数不能用于安全应用的原因.

使用特权

评论回复
9
wahahaheihei| | 2017-3-14 19:43 | 只看该作者
zhanzr21 发表于 2017-3-14 19:37
你没有仔细看
我的贴子的是评测STM32F722的TRNG,
也就是真随机数发生器,

原来如此,懂了。

使用特权

评论回复
10
ileonli| | 2017-8-22 14:43 | 只看该作者
你好,运行完之后会出现如下图错误是咋回事,谢谢
现在还有一种情况,我自己从NIST官网下载了sts-2.1.2这个,把你附件中的bin文件放进去检测后,不会出现分析结果,这是为何,求解答?

使用特权

评论回复
11
捉虫天师| | 2017-8-22 15:07 | 只看该作者
HAL_RNG_GetRandomNumber(&hrng)
这个是HAL库提供的?这么爽。

使用特权

评论回复
12
zhanzr21|  楼主 | 2017-8-22 16:08 | 只看该作者
ileonli 发表于 2017-8-22 14:43
你好,运行完之后会出现如下图错误是咋回事,谢谢
现在还有一种情况,我自己从NIST官网下载了sts-2.1.2这个 ...

你看报错语句: 找不到freq.txt
你的配置跟我不一样
你可以先用套件中提供的示例sample先做做实验

使用特权

评论回复
13
ileonli| | 2017-8-23 11:29 | 只看该作者
zhanzr21 发表于 2017-8-22 16:08
你看报错语句: 找不到freq.txt
你的配置跟我不一样
你可以先用套件中提供的示例sample先做做实验 ...

你好,还有个问题想问一下,你附件中给的bin文件大小是63kB,文件中有F9FF个字节63999个byte,即63999*8bit=511992这么多bit,为何在assess 后面的却是51200,我有改过这个数值为52100,但是最后会出现不足的数据错误提示,见图。assess 51200就不会出现,求解答,谢谢! assess 后面跟的不是bit的数值么?

使用特权

评论回复
14
zhanzr21|  楼主 | 2017-8-23 12:36 | 只看该作者
ileonli 发表于 2017-8-23 11:29
你好,还有个问题想问一下,你附件中给的bin文件大小是63kB,文件中有F9FF个字节63999个byte,即63999*8b ...

你看看套件里面的readme 代码也有 应该好理解
我自己当时做实验是比ST自己做的实验数据样本要少一些 因为我不需要那么多
当时过认证搞的实验, 非常细节的东西 过了几个月了 也不是非常清楚了

使用特权

评论回复
15
ileonli| | 2017-8-24 15:53 | 只看该作者
zhanzr21 发表于 2017-8-23 12:36
你看看套件里面的readme 代码也有 应该好理解
我自己当时做实验是比ST自己做的实验数据样本要少一些 因 ...

你好,楼主,请问下 ,如图中计算出的数据,有两个疑问请问下:1、universal这项是不测试么,结果为0,后面标注星号,还是测试结果就是0,不合格;   2、为何random开头的两项未进行测试啊?你之前测试时有这种情况么?谢谢!!!!!!!!!!

使用特权

评论回复
16
zhanzr21|  楼主 | 2017-8-24 16:21 | 只看该作者
ileonli 发表于 2017-8-24 15:53
你好,楼主,请问下 ,如图中计算出的数据,有两个疑问请问下:1、universal这项是不测试么,结果为0,后 ...

都要测试的, 有可能你给的数据不合要求

使用特权

评论回复
17
ileonli| | 2017-8-25 11:19 | 只看该作者
zhanzr21 发表于 2017-8-24 16:21
都要测试的, 有可能你给的数据不合要求

关于第一个问题,我增大了二进制文件的数据量有测,第二个问题仍然没有改变。另外楼主方便说下QQ号么,方便请教,不胜感谢。

使用特权

评论回复
18
zhanzr21|  楼主 | 2017-8-25 11:44 | 只看该作者
ileonli 发表于 2017-8-25 11:19
关于第一个问题,我增大了二进制文件的数据量有测,第二个问题仍然没有改变。另外楼主方便说下QQ号么,方 ...

我最近没有搞这个测试了, 上次也是为了过认证搞了一下子, 都是看STS附带的文档就可以了
现在也记得不是很清楚了, 所以加我QQ 我也是要看文档的
你把那文档过一遍 有讲测试方法的
ST有个文档专门讲这个怎么测试的
我等会要是找得到就传在这里

使用特权

评论回复
19
zhanzr21|  楼主 | 2017-8-25 11:45 | 只看该作者
找到了,
请看这个:
http://www.st.com/content/st_com ... /stsw-stm32129.html
他这个讲的有点啰嗦 不过讲清楚了如何做实验的步骤

使用特权

评论回复
20
ileonli| | 2017-8-25 14:44 | 只看该作者
zhanzr21 发表于 2017-8-25 11:45
找到了,
请看这个:
http://www.st.com/content/st_com/en/products/embedded-software/mcus-embedded-softw ...

文档搜到了,谢谢,我看了下,ST那个测试文档中的RANDOMExcursion和RANDOMExcursionVariant测试结果也是空的,还是不解,哭。。。。。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:每天都進步

91

主题

1013

帖子

34

粉丝