CryptoPP的RandomPool算法的使用_柳亓的博客-程序员宅基地_randompool

技术标签: CryptoPP的使用以及设计原理和设计思想  CryptoPP  RandomPool算法使用  RandomPool  密码学库Cryptopp  密码学库Crypto++的使用  密码学库  

随机数发生器是密码学的一个重要原语。密码学库CryptoPP中提供了一些随机数发生器算法。前面讲述了LC_RNG算法的使用:https://blog.csdn.net/Lunar_Queen/article/details/81542372。今天,讲解一下RandomPool随机数发生器算法的使用。
从库的帮助文档可以看到,该类和前面讲的LC_RNG都继承自基类RandomNumberGenerator。如下图所示:
这里写图片描述
因此,该类的对象和前面讲的LC_RNG类都使用一样的成员函数来产生随机数。RandomPool的各成员函数意义,详见
https://blog.csdn.net/Lunar_Queen/article/details/81542372以及其帮助文档。
因此,在使用RandomPool时,相较于前面的程序,只要把包含该算法的头文件包含进来,并用该类定义一个对象即可,其他地方不用改动。如下图所示:
这里写图片描述
源代码如下:

#include<cryptlib.h>
#include<randpool.h>//包含RandomPool算法的头文件
#include<iostream>
#include<fstream>
#include<stdlib.h>
using namespace std;
using namespace CryptoPP;

#define Array_Size 64

int main()
{
	//定义一个RandomPool对象,注意该RNG不需要种子。
	RandomPool   rng;
	//定义一个文件对象
	ofstream file("data.dat",ios_base::binary | ios_base::out);

	byte output[Array_Size];

	//产生1Gbits的数据。每调用一次随机数发生器,产生8*64=512bits的数据。
	//1Gbits = 1000*1000*1000。
	//1000*1000*1000/512 = 1953125。

	cout << "开始生成数据..." << endl;
	clock_t start = clock();

	for(int i=0; i < 1953125 ; ++i)
	{
		rng.GenerateBlock(output,Array_Size);
		file.write(reinterpret_cast<const char*>(output),Array_Size);
	}
	clock_t end = clock();
	cout << "数据生成完毕..." << endl;

	double  duration;
	duration = (double)(end - start) / CLOCKS_PER_SEC;
	cout << "生成数据总共耗时:" << duration << endl;

	file.close();

	return 0;
}

执行上述程序,运行结果如下图所示:
这里写图片描述
可以看到利用该算法产生1Gbit的数据,并将产生的数据存放至磁盘上的文件,同时,统计产生这些数据所消耗的时间为2.992秒。
需要注意的是,该算法可以产生密码学质量的随机数,同时,该算法不需要外部输入种子。
这里写图片描述

更多示例代码详见《深入浅出CryptoPP密码学库》随书电子文档:https://github.com/locomotive-crypto/crypto_book_1st

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Lunar_Queen/article/details/81560777

智能推荐

Spinner的两种调用数据放式_faith_boys的博客-程序员宅基地

ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_spinner_item, mLmtdReptStr);adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);mSpinner.setAd

ROS arbotix踩坑:‘rospkg‘、except UnicodeDecodeError, exc、dynamic module does not define init function_#君君#的博客-程序员宅基地_ros 安装rospkg

在执行roslaunch mbot_description arbotix_mbot_with_camera_xacro.launch文件时,即包含arbotix模块的程序时,报错No module named ‘rospkg’ 。报错No module named 'rospkg'经过对大家文章的查看,发现基本集中在把环境配置为python3.或者安装rospkg。但是仍没有解决。查看opt/ros/melodic/lib/python2.7/dist-packages,发现根本没有ro.

面试题:实现数组扁平化_weixin_34056162的博客-程序员宅基地

什么是数组扁平化数组扁平化是指将一个多维数组变为一维数组reduce 方法实现reduce 本身就是一个迭代循环器,通常用于累加,所以根据这一特点有以下:const arr1 = [1,[4,6],[8,3,[19,38]]]function flatten(arr) { return arr.reduce((result, item)=&gt; { return re...

JfreeChart用法总结_shiyan0634的博客-程序员宅基地

一、简介 WW 的发展使得基于因特网的应用程序不再局限于静态或者简单的动态内容提供。传统的一些以软件包形式发布应用程序例如报表系统等都在逐渐搬到因特网上。但是这两者之间有着天壤之别,虽然对于数据获取、业务处理等方面基本类似,但是最大的差别在于用户界面。为了能在web浏览器上显示要求用户界面使用 HTML以及图片的方式来展现数据,而传统的一些利用操作系统本身的控件来开发的用户界面无法适应琳琅满目

微信扫码支付 模式一 (JSAPI)_ouyuyao的博客-程序员宅基地

这个微信支付是静态二维码支付,就是店面贴着一个二维码,让消费者自己扫自己输入金额,自己发起支付的支付方式。要准备的东西比较麻烦: 1、到微信公众号平台设置Oauth2的网页验证域名(用于获取code,code用于拿到发起支付的openId),格式是www.xxxx.com/file1/file2/,不需要https:// 要精确到发起支付页面的当前路径 2、配置Oauth2网页验证域名的时候,需

一文梳理金融风控建模全流程(Python)_风度78的博客-程序员宅基地

一、信贷风控简介 信贷风控是数据挖掘算法最成功的应用之一,这在于金融信贷行业的数据量很充足,需求场景清晰及丰富。信贷风控简单来说就是判断一个人借了钱后面(如下个月的还款日)会不会按期还钱。更专业来说,信贷风控是还款能力及还款意愿的综合考量,根据这预先的判断为信任依据进行放贷,以此大大提高了金融业务效率。与其他机器学习的工业场景不同,金融是极其厌恶风险的领域,其特殊性在于非...

随便推点

Vscode的使用小技巧_weixin_30399821的博客-程序员宅基地

命令行启动code如果你的系统是Linux系统(我使用的是Ubuntu 16.04)这样就可以直接使用 code + filename来编辑文件(就像vi + filename)如果你的系统是MacOS 就需要在vscode里面按 command + shift + p 之后输入 shell 基本上在第一提示里面就会显示安装code,如图所示转载于:https://www.cnblo...

SpringMVC -> 转发(forward)和重定向(redirect)_欧皇小德子的博客-程序员宅基地_springmvc转发的关键字是redirect

默认写法就是转发:return的字符串将对应的前端页面转发到要求的url上配置了视图解析器的viewsresolver @RequestMapping("/hello/{a}/{b}") public String hello(@PathVariable int a, @PathVariable int b, Model model) { model.addAttribute("haha", "结果:" + (a + b)); return "hello"; }没有视图解析器

ros kinetic 自带opencv3 与 opencv 2 的兼容问题_原野寻踪的博客-程序员宅基地

问题分析自己写的系统必须基于opencv 2.x,而ros kinetic自带了opencv3的版本。于是在编译时报错:/usr/bin/ld: CMakeFiles/xxxx.cpp.o: undefined reference to symbol '_ZN2cv6String10deallocateEv'/opt/ros/kinetic/lib/x86_64-linux-gnu/l...

Latex002 | 详细教程:LaTeX 编译器哪个好?——如何在 Visual Studio Code 中全流程编写 LaTeX(上篇)_爱学习的Allan的博客-程序员宅基地_latex编译器

你是否在编写 LaTeX 过程中遇到了编译器“不给力”,无法自动补全、缩进等问题?本文比较了流行的 LaTeX 的编译器,并简要分析了其优势与不足,最终给出解决方案。

16 Java数组--数组的定义、声明和创建_一起加油(ง •̀_•́)ง的博客-程序员宅基地

数组的定义数组是相同类型数据的有序集合数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们。数组的声明首先必须声明数组变量,才能在程序中使用数组dataType[] arrayRefVar; //首选声明方法或dataType arrayRefVar[];Java语言使用new操作符来创建数组dataType[] arrayRefVar = new dataType[arraySize];

推荐文章

热门文章

相关标签