最近写毕业论文,有一部分需要用到随机数测试,从网上找到的NIST程序教程都不够细致,博主今天终于搞懂了这个程序怎么用的,防止遗忘,今天就记录在这里
1、首先从官网上下载测试程序
链接:https://csrc.nist.gov/projects/random-bit-generation/documentation-and-software
国内可以访问,不需要科学上网
解压打开后发现是一个c语言工程,目录下有一个makefile,到这里就明白了这是一个运行在linux下的应用程序

2、打开linux,博主这里使用的是ubuntu,在windows下也可以使用,不过需要配置一大堆环境,博主这里刚好装了虚拟机,就直接复制到了linux中

3、使用vs code打开这个工程,然后快捷键ctrl+~,打开终端,确保makefile在当前目录中,在终端中输入"make"命令,程序会自动编译,生成一个"assess"文件,这个文件就是我们随后要使用的应用程序


4、为了测试该程序是否正常工作,需要生成一个测试序列,博主使用matlab随手生成了一个二进制伪随机序列
tent_ode.m
'''
function ret=tent_ode(x,u,M)
ret=zeros(M,1);
ret(1)=x;
for i=2:M
if ret(i-1)<0.5
ret(i)=2uret(i-1);
end
if ret(i-1)>=0.5
ret(i)=2u(1-ret(i-1));
end
end
'''
tent_out.m
'''
close all;clear;
M = 102400;
ret=tent_ode(0.1,0.99,M);
rand_bin_stream=floor(mod(ret100,2));
fid=fopen("rbs","w");
tmp=0;
for i=1:M
if(mod(i,8))
tmp=tmp+rand_bin_stream(i)power(2,8-(mod(i,8)));
else
tmp=tmp+rand_bin_stream(i);
fwrite(fid,tmp);
tmp=0;
end
end
fclose(fid);
'''
博主使用的是帐篷映射来产生伪随机序列,为了尽可能的去除序列中的相关性,博主又截取了小数点后面若干位作为二进制伪随机序列,这里会生成一个102400长度的二进制伪随机序列。
这段代码里面需要注意的是,伪随机序列是一个二进制比特流,这也是NIST唯一支持的格式。博主这里使用的是二进制方式保存二进制比特流,NIST也支持以ASCII方式保存的二进制比特流
运行这段代码,打开输出的rbs文件,


如图,脚本生成了102400长度的伪随机二进制序列,且正确保存在了rbs中(注意,这个长度只能是32的整数倍,否则会出现一大堆igamc:underflow报错,有能力的可以看一下NIST原码,找一下原因)(此处存疑,应该是输入数据长度不够导致的)
5、将rbs文件复制到linux下的当前目录中去(也可以是别的目录,NIST支持绝对路径),在终端中输入命令:

需要注意的是assess的参数,博主计划将该数据分为十组进行测试,102400/10=10240,因此assess的参数是10240,这个10240就是./assess <长度>的参数。
6、Enter Choice: 0
输入0,该命令告诉app从文件中获取测试数据
User Prescribed Input File: rbs
输入rbs,告诉app测试数据在那个文件中

7、Enter Choice: 1
选1
8、Select Test(0 to continue): 0
选0

9、How many bitstreams? 10
这里的参数就是你想让你的测试数据分成多少次参与测试,博主将数据分成10组,因此这个参数就是10.

这里的输入数值与assess的输入参数相乘需要等于测试数据的总长度。
10、选择输入文件的格式,博主的测试数据是二进制保存的,因此选1

11、计算结果分析