随机数检测代码运行

测试步骤

  • 1.准备测试数据
使用待测的(伪)随机数发生器,产生足够长度的随机数序列。(样本参数见附录)
  • 2.在NIST的测试源码中,添加4个国密特有的测试用例
扑克测试,游程分布测试,二元推导测试,自相关测试
  • 3.编译源码得到测试程序

    在sts-2.1.2目录下make即可

  • 4.运行测试程序,选择待测试数据,按照NIST测试用例和测试参数进行设置
1.执行测试程序,$ ./assess 1000000
2. 输入0,选择从文件读入随机数
3. 输入随机数路径及文件名,例如data/data1.bin
4. 输入0,选择NIST测试模式
5. 输入2,选择测试所有NIST用例
6. 输入0,NIST用例使用默认参数即可(如果需要修改参数输入相应的编号进行修改)
7. 输入1000,选择测试的样本数量
8. 输入1,选择输入的文件类型为二进制(选择0表示全是01的ASCII文件)
9. 按回车即开始测试
  • 5.测试结束之后,分析测试结果,看是否满足预期要求
  • 6.运行测试程序,选择待测试数据,按照国密规范选择对应测试用例,并进行参数设置
1.执行测试程序 $ ./assess 1000000
2. 输入0,选择从文件读入随机数
3. 输入随机数路径及文件名,例如data/data1.bin
4. 输入1,选择国密测试模式,固定为国密的测试参数
5. 输入3,选择测试所有GM用例
6. 输入1000,选择测试的样本数量
7. 输入1,选择输入的文件类型为二进制(选择0表示全是01的ASCII文件)
8. 按回车即开始测试
  • 7.测试结果之后,分析测试结果,看是否满足预期要求

结果分析

  • 1.通过测试的样本比例(NIST标准)

根据样本总个数和显著性水平,计算判定用例通过的最小样本个数

对于样本数为1000,显著性水平为0.01的情况,通过的比例需要在0.98以上

即1000的样本需要有980个通过。

  • 2.P值均匀分布(仅NIST)

对每个测试样本的P值结果,按照0.1的区间间隔进行数量统计,计算P值统计结果的P值。

如果最终的P值大于0.0001,则认为是均匀分布的。

序号 检测项目 国密参数 NIST参数
1 块内频数测试 m=100 m=128
2 扑克测试(国密) m=4; m=8 /
3 重叠子序列测试 m=2; m=5 m=16
4 块内最长游程测试 m=10000 m=10000
5 二元推导测试(国密) k=3; k=7 /
6 自相关测试(国密) d=1, 2, 8, 16 /
7 矩阵秩测试 M=Q=32 M=Q=32
8 近似熵测试 m=2; m=5 m=10
9 线性复杂度测试 m=500 m=500
10 非重叠模板测试(NIST) / m=9
11 重叠模板测试(NIST) / m=9
12 通用测试 L=7,Q=1280 L=7,Q=1280

显著性水平α=0.01

样本参数

参数
样本长度 10^6 bits
样本个数 1000

随机数样本生成方法

  • 1.openssl随机数样本生成方法
openssl rand -out data.openssl 1000000000
  • 2.用C语言中rand函数生成随机数样本(glibc版本2.27)
./c_rand 1024 data.c_rand 1000000000
  • 3.其中c_rand程序的源码c_rand.c如下
#include <stdlib.h>
#include <stdio.h>

#define buffer 1024

int main(int argc, char *argv[])
{
	int j, r, nbytes;
	unsigned int seed;
	FILE* fp = NULL;
	size_t res = 0;
	if (argc != 4) {
	fprintf(stderr, "Usage: %s <seed> <rand_file> <nbytes>\n", argv[0]);
	return -1;
 	}

	seed = atoi(argv[1]);
	nbytes = atoi(argv[3]);
	srand(seed);

	unsigned char* out = new unsigned char[buffer];
	unsigned char* cur = out;
	if (!(fp = fopen(argv[2], "wb")))
	{
 		printf("file %s open fail!", argv[2]);
 		delete[] out;
 		return -1;
	}

	for (j=0;j<nbytes; ++j) {
		r =  rand()%256;
		*cur++ = *((unsigned char*)(&r));
		if((!(( j + 1 ) % buffer)) || ( j + 1 == nbytes))
		{
			size_t num = j % buffer + 1;
      		res = fwrite(out, 1, num, fp);
      		if (res != num)
      		{
        		fclose(fp);
        		delete[] out;
        		printf("file %s write fail!", argv[2]);
        		return -1;
			}
      			cur = out;
		}
	}
		fclose(fp);
		delete[] out;
		return 0;
}
  • 4.采集握手中ClientHello随机数

生成随机数命令:

openssl s_server -engine ./engine.so -cert test/rsa-ext.pem -key test/rsa.key -CAfile ca/rsa-ca.pem -www -accept 8888

./ssl -h 192.168.1.10 -p 8888 -s 128000000 -f binary -o data.handshake -m tls1_2
  • 5.采集硬件加密卡生成的随机数样本

前置条件:完成硬件安装,驱动安装,编译openssl 引擎得到engine.so

openssl rand -engine ./engine.so -out data.cryptocard 1000000000

实验结果

总结

本来打算自己尝试编码或者实在不行找一下代码尝试自己修改,最终发现自己暂时还是没那个能力,所以还是使用了NIST的测试源码,在网上查阅博客跟着博客运行了起来。感性认识了一下伪随机数的检测。后面打算找一些论文自己看看,尝试写一篇综述类文章发表。以上就是最近的学习总结,如有不足请老师指正。

原文地址:https://www.cnblogs.com/destiny-love/p/12708180.html

时间: 04-15

随机数检测代码运行的相关文章

安装并使用CheckStyle/PMD与FindBug &amp;&amp; 安装并使用SourceMonitor检测代码复杂度

一.安装并使用CheckStyle  (一)安装 (1) 首先从官网上下载net.sf.eclipsecs-updatesite_6.5.0.201504121610-bin 并解压chekstyle中的文件. (2)然后解压checkstyle文件中的压缩文件,将里面的两个文件夹plugins和 features下面的文件分别拷贝到eclipse目录下面对应的plugins和features目录,重启eclipse. (3)Eclipse中,选择Windows->Preferences->c

Linux下c++程序内存泄漏检测代码范例

Linux下对于程序内存泄漏检测的方法很多,最常用的的莫过于使用valgrind工具.但是valgrind相当于让程序在虚拟机中运行,会带来较大的系统资源开销,还会对程序的运行效率产生较大影响,对于那种资源占用大的程序,如果需要长时间运行才能暴露的泄漏问题,它就显得不太好用. linux下的c++程序中自己实现一个轻量级的泄漏检测代码其实是比较方便的,下面我就给出一个简单的范例,并作简单的说明.当然,我们还是应该提倡使用共享指针,用共享指针自动管理内存可以避免内存泄漏这样的不必要的麻烦. 基本原

Python-OpenCV人脸检测(代码)

Python-OpenCV人脸检测(代码) @author:wepon @blog:http://blog.csdn.net/u012162613/article/details/43523507 做人脸识别,首先要检测出图片/视频中的人脸,今天就研究了一下OpenCV的Python接口,把常用的一些功能模块写成函数.基于Python-OpenCV以及PIL,实现图片中人脸的检测以及截取保存.眼睛检测.笑脸检测.下面简单总结一下. 一.软件安装 安装Python-OpenCV以及其依赖库.PIL

C# 开机检测是否运行某程序的方法

C#  开机检测是否运行某程序的方法 现在开发软件,一般都喜欢搞一个运行前检测,ps这类,检测环境是够适合运行,加载工具什么的.今天做软件用到了检测是否运行的问题,学习后分享: 在C#项目中找到“Program.cs”,修改代码如下: namespace CastPlayer_v1._0{    static class Program    {        /// <summary>        /// 应用程序的主入口点.        /// </summary>    

unity中检测代码执行时间

使用unity编写代码的大多数使用的都是c#,c#中可以使用特定的语句来对代码的执行效率进行检测. 检测代码如下: using UnityEngine; using System.Collections; public class Test: MonoBehaviour { void Update() { if (Input.GetKeyDown(KeyCode.G)) { TestExeTime(); } } void TestExeTime() { System.Diagnostics.St

关于执行findbugs,checkstyle,jacoco插件检测代码,GitHook的脚本编写

Git钩子的作用: (pre-commit ) 在用户执行 git commit -m "xxx" 命令之前,先执行pre-commit文件中的脚本命令 在pre-commit文件中,编写脚本 执行pom.xml中配置的各种插件 对代码先进行检测 如果所有插件都检测通过,git commit 命令才能执行成功,然后才能继续执行 git push 命令 否则 commit失败,git push的内容会为空. 简而言之:就是控制代码的提交,在代码提交到远程仓库之前会先对代码进行检查(检查内

堆栈 Cookie 检测代码检测到基于堆栈的缓冲区溢出

 报错:0x000CC3C9 处有未经处理的异常(在 image_opencv2.exe 中):  堆栈 Cookie 检测代码检测到基于堆栈的缓冲区溢出. 主要检查代码中有没有对数组的越界操作,就解决了这个bug. 其它的相关知识查后再补充.

内存的划分 &amp; 程序代码运行时内存工作流程

内存的划分: 1,寄存器. 2,本地方法区. 3,方法区. 4,栈内存. 存储的都是局部变量. 而且变量所属的作用域一旦结束,该变量就自动释放. 5,堆内存. 存储是数组和对象(其实数组就是对象) ,凡是new建立的都在堆中. 特点: 1)每一个实体都有首地址值. 2)堆内存中的每一个变量都有默认初始化值,根据类型的不同而不同.整数是0,小数0.0或者0.0f,boolean类型是false,char类型是 '\u0000',引用数据类型是NULL 3)垃圾回收机制. 全局变量和局部变量的区别:

第十章实践——系统级I/O代码运行

第十章实践——系统级I/O代码运行 实验代码清单如下: 1. cp1——复制一个文件到另一个文件中(两个已经存在的文件) 复制前: 执行后结果 2.

springAop 使用@Around,@After等注解时,代码运行两边的问题

springAop使用@Around,@After等注解时,代码运行两边的问题 将@Component注解删掉就好了