OpenSSL测试-随机数

任务详情

  1. 在openEuler(推荐)或Ubuntu或Windows(不推荐)中完成下面任务
  2. 使用OpenSSL定义一个私有函数 static int getRandom(char *r, int length), 获取length个字节的随机数(5’)
  3. 把上述函数集成到src中的sdf.c中的SDF_GenerateRandom中(5’)
  4. 在test中的main.c调用SDF_GenerateRandom进行测试,至少测试1个字节,5个字节,20个字节三种情况。(5’)
  5. 提交代码(或代码链接)和运行结果截图

任务过程

使用OpenSSL定义一个私有函数 static int getRandom(char *r, int length), 获取length个字节的随机数
把该函数集成到sdf.c中
sdf.c

OpenSSL测试-随机数

1字节测试

OpenSSL测试-随机数

5字节测试

OpenSSL测试-随机数

20字节测试

OpenSSL测试-随机数

代码

sdf.h

#ifndef _SDF_H
#define _SDF_H
//定义设备信息结构
typedef struct DeviceInfo_st{
unsigned char IssuerName[40]; //设备生产商名称
unsigned char DeviceName[16];
unsigned char DeviceSerial[16];
unsigned int DeviceVersion;
unsigned int StandardVersion;
unsigned int AsymAlgAbility[2];
unsigned int SymAlgAbility;
unsigned int HashAlgAbility;
unsigned int BufferSize;
}DEVICEINFO;

//Error Code
#define SDF_OK 0x0 //操作成功
#define SDR_BASE   0x01000000   //错误码基础值
#define SDR_UNKNOWERR   SDR_BASE+0x00000001  //未知错误
#define SDR_NOTSUPPORT   SDR_BASE+0x00000002  //不支持的接口调用
#define SDR_COMMFAIL   SDR_BASE +0x00000003  //与设备通信失败
#define SDR_HARDFAIL    SDR_BASE+ 0x00000004   //运算模块无响应
#define SDR_OPENDEVICE   SDR_BASE+0x00000005  //打开设备失败
#define SDR_OPENSESSION  SDR_BASE + 0x00000006  //创建会话失败
#define SDR_PARDENY   SDR_BASE +0x00000007    //无私钥使用权限
#define SDR_KEYNOTEXIST   SDR_ BASE+0x00000008   //不存在的密钥调用
#define SDR_ALGNOTSUPPORT   SDR_BASE + 0x00000009  //不支持的算法调用
#define SDR_ALGMODNOTSUPPORT   SDR_BASE+ 0x0000000A   //不支持的算法模式调用
#define SDR_PKOPERR   SDR_BASE+ 0x0000000B   //公钥运算失败
#define SDR_SK OPERR  SDR_BASE + 0x0000000C  //私钥运算失败
#define SDR_SIGNERR    SDR _BASE+0x0000000D   //签名运算失败
#define SDR_VERIFYERR   SDR_BASE +0x0000000E   //验证签名失败
#define SDR_SYMOPERR   SDR_BASE+ 0x0000000F   //对称算法运算失败
#define SDR_STEPERR   SDR_BASE+0x00000010  //多步运算步骤锗误
#define SDR_FILES1ZEERR   SDR_BASE+0x00000011  //文件长度超出限制
#define SDR_FILENOEXIST   SDR_BASE+0x00000012   //指定的文件不存在
#define SDR_FILEOFSERR  SDR_BASE+0x00000013  //文件起始位置错误
#define SDR_KEYTYPEERR  SDR_BASE+0x00000014  //密钥类型缙误
#define SDR_KEYERR  SDR_BASE+0x00000015  //密钥缙误
#define SDR_ENCDATAERR  SDR_BA3E+0x00000016  //ECC加密数据错误
#define SDR_RANDERR  SDR_BASE+0x00000017  //随机数产生失败
#define SDR_PRKRERR  SDR_BASE+0x00000018  //私钥使用权限获取失败
#define SDR_MACFRR  SDR_BASE+0x00000019 //MAC运算失败
#define SDR_FILEEXISTS   SDR_BASE+ 0x0000001A  //指定文件已存在
#define SDR_FILEWERR  SDR_BASE+0x0000001B  //文件写入失败
#define SDR_NORUFFER  SDR_BASE+0x0000001c  //存储空间不足
#define SDR_INARGERR  SDR_BASE+0x0000001D  //输入参数错误
#define SDR_OUTARGERR  SDR_BASE +0x0000001E  //输出参数错误

//设备管理
/*
功能:打开密码设备
参数:
phDeviceHandle[out]返回设备句柄
返回值:
0       成功
非0   失败,返回错误代码
备注:
phDeviceHandle由函数初始化并填写内容
*/
int SDF_OpenDevice(void ** phDeviceHandle);

/*
功能:关闭密码设备,并释放相关资源。
参数:
hDeviceHandle[in]   已打开的设备句柄
返回值:
0        成功
非0     失败,返回错误代码
*/
int SDF_CloseDevice( void * hDeviceHandle);

/*
功能:获取密码设备能力描述。
参数:
hSessionHandle[in]  与设备建立的会话句柄
pstDeviceInfo [out]  设备能力描述信息,内容及格式见设备信息定义
返回值:
0        成功
非0     失败,返回错误代码
*/
int SDF_GetDeviceInfo(
void * hSessionHandle,
DEVICEINFO * pstDeviceInfo);

/*
功能:获取指定长度的随机数。
参数:hSessionHandle[in]   与设备建立的会话句柄
uilength[in]   欲获取的随机数长度
pucRandom[out]   缓冲区指针,用于存放获取的随机数
返回值:
0        成功
非0     失败,返回错误代码
*/
int SDF_GenerateRandom (
void * hSessionHandle,unsigned int uiLength,
unsigned char * pucRandom);

#endif

main.c


#include<stdio.h>
#include<stdlib.h>
#include&#xA0;"sdf.h"
int&#xA0;main(){
&#xA0;&#xA0;&#xA0;void&#xA0;**pdh;
&#xA0;&#xA0;&#xA0;pdh=(void&#xA0;**)malloc(20);  //&#x7ED9;pdh&#x5206;&#x914D;&#x7A7A;&#x95F4;
&#xA0;&#xA0;&#xA0;int&#xA0;ret;
&#xA0;&#xA0;&#xA0;ret&#xA0;=&#xA0;SDF_OpenDevice(pdh);  //&#x8FD4;&#x56DE;handle&#x7684;&#x6307;&#x9488;

&#xA0;&#xA0;&#xA0;if(ret&#xA0;!=&#xA0;SDF_OK)
&#xA0;&#xA0;&#xA0;{
&#xA0;&#xA0;&#xA0;&#xA0;printf("&#x6253;&#x5F00;&#x8BBE;&#x5907;&#x5931;&#x8D25;\n");
&#xA0;&#xA0;&#xA0;}
&#xA0;&#xA0;&#xA0;else
&#xA0;&#xA0;&#xA0;{
&#xA0;&#xA0;&#xA0;&#xA0;printf("&#x6253;&#x5F00;&#x8BBE;&#x5907;&#x6210;&#x529F;&#xFF01;\n");
&#xA0;&#xA0;}
&#xA0;&#xA0;&#xA0;printf("&#x67E5;&#x770B;&#x8BBE;&#x5907;&#x4FE1;&#x606F;\n");
&#xA0;&#xA0;&#xA0;DEVICEINFO&#xA0;a;
&#xA0;&#xA0;&#xA0;ret&#xA0;=&#xA0;SDF_GetDeviceInfo(*pdh,&a);
&#xA0;&#xA0;&#xA0;if(ret&#xA0;!=SDF_OK)
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;printf("&#x67E5;&#x770B;&#x8BBE;&#x5907;&#x4FE1;&#x606F;&#x5931;&#x8D25;&#xFF01;\n");
&#xA0;&#xA0;&#xA0;else
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;printf("&#x67E5;&#x770B;&#x8BBE;&#x5907;&#x4FE1;&#x606F;&#x6210;&#x529F;&#xFF01;\n");
&#xA0;&#xA0;&#xA0;printf("&#x8BBE;&#x5907;&#x540D;&#x5B57;&#x53EB;&#x505A;%s\n",a.DeviceName);
&#xA0;&#xA0;&#xA0;printf("&#x8BBE;&#x5907;&#x7248;&#x672C;&#x53F7;&#x4E3A;%d\n",a.DeviceVersion);
&#xA0;&#xA0;&#xA0;printf("&#x60F3;&#x8981;&#x83B7;&#x53D6;&#x7684;&#x968F;&#x673A;&#x6570;&#x957F;&#x5EA6;&#x4E3A;&#xFF1A;\n");
&#xA0;&#xA0;&#xA0;int&#xA0;n;
&#xA0;&#xA0;&#xA0;scanf("%d",&n);
&#xA0;&#xA0;&#xA0;char&#xA0;string[100];
&#xA0;&#xA0;&#xA0;ret&#xA0;=&#xA0;SDF_GenerateRandom(*pdh,n,string);
&#xA0;&#xA0;&#xA0;if(ret&#xA0;!=SDF_OK)
&#xA0;&#xA0;&#xA0;&#xA0;printf("&#x751F;&#x6210;&#x968F;&#x673A;&#x6570;&#x5931;&#x8D25;&#xFF01;");
&#xA0;&#xA0;&#xA0;&#xA0;else
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;printf("&#x751F;&#x6210;&#x7684;&#x968F;&#x673A;&#x6570;&#x4E3A;%s\n",string);
&#xA0;&#xA0;&#xA0;ret&#xA0;=&#xA0;SDF_CloseDevice(*pdh);
&#xA0;&#xA0;&#xA0;if(ret&#xA0;!=&#xA0;SDF_OK)
&#xA0;&#xA0;&#xA0;{
&#xA0;&#xA0;&#xA0;&#xA0;printf("&#x5173;&#x95ED;&#x4E0D;&#x6210;&#x529F;&#xFF01;\n");
&#xA0;&#xA0;&#xA0;}
&#xA0;&#xA0;&#xA0;else
&#xA0;&#xA0;&#xA0;{
&#xA0;&#xA0;&#xA0;&#xA0;printf("&#x5173;&#x95ED;&#x6210;&#x529F;&#xFF01;\n");
&#xA0;&#xA0;&#xA0;}
}

</stdlib.h></stdio.h>

sdf.c


#include<stdio.h>
#&#xA0;include&#xA0;<stdlib.h>
#include<string.h>
#include&#xA0;"sdf.h"
#include<time.h>
#include&#xA0;<openssl bn.h>
int&#xA0;SDF_OpenDevice(&#xA0;void&#xA0;**&#xA0;phDeviceHandle)
{
&#xA0;return&#xA0;SDF_OK;
}
int&#xA0;SDF_CloseDevice(&#xA0;void&#xA0;*&#xA0;hDeviceHandle)
{
&#xA0;return&#xA0;SDF_OK;
}
int&#xA0;SDF_GetDeviceInfo(void&#xA0;*&#xA0;hSessionHandle,DEVICEINFO&#xA0;*&#xA0;pstDeviceInfo)
{
&#xA0;DEVICEINFO&#xA0;di;
&#xA0;strcpy(di.IssuerName,"tzjSDF");
&#xA0;strcpy(di.DeviceName,"SDFzjy20191223");
&#xA0;strcpy(di.DeviceSerial,"20210425");
&#xA0;di.DeviceVersion=1;
&#xA0;(*pstDeviceInfo)=&#xA0;di;&#xA0;
&#xA0;
&#xA0;return&#xA0;SDF_OK;
}
int&#xA0;SDF_GenerateRandom&#xA0;(void&#xA0;*&#xA0;hSessionHandle,unsigned&#xA0;int&#xA0;uiLength,unsigned&#xA0;char&#xA0;*&#xA0;pucRandom)
{
&#xA0;BIGNUM&#xA0;*bn;
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;int&#xA0;i;
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;bn&#xA0;=&#xA0;BN_new();&#xA0;//&#x751F;&#x6210;&#x4E00;&#x4E2A;BIGNUM&#x7ED3;&#x6784;
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;//int&#xA0;bits&#xA0;=&#xA0;20;
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;int&#xA0;top&#xA0;=&#xA0;-1;
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;int&#xA0;bottom&#xA0;=&#xA0;1;
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;BN_rand(bn,&#xA0;uiLength,&#xA0;top,&#xA0;bottom);&#xA0;//&#x751F;&#x6210;&#x6307;&#x5B9A;bits&#x7684;&#x968F;&#x673A;&#x6570;
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;char&#xA0;*a&#xA0;=&#xA0;BN_bn2hex(bn);&#xA0;//&#x8F6C;&#x5316;&#x6210;16&#x8FDB;&#x5236;&#x5B57;&#x7B26;&#x4E32;
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;puts(a);
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;printf("\n");
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;for(i=0;*(a+i)!='\0';i++)
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;{
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;*(pucRandom+i)=*(a+i);
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;}
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;*(pucRandom+i)='\0';
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;BN_free(bn);&#xA0;//&#x91CA;&#x653E;BIGNUM&#x7ED3;&#x6784;
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;return&#xA0;SDF_OK;
}

</openssl></time.h></string.h></stdlib.h></stdio.h>

Original: https://www.cnblogs.com/zzjjyy123/p/16202695.html
Author: 20191223张俊怡
Title: OpenSSL测试-随机数

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/585829/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Linux 将本地文件上传Linux服务器, 即ssh 命令上传本地文件

    在linux下一般用scp这个命令来通过ssh传输文件。 1、从服务器上下载文件 scp username@servername:/path/filename /var/www/l…

    Linux 2023年6月13日
    0119
  • OpenStack 发放云主机

    登陆网址 具体安装步骤欢迎参照我的博客:https://www.cnblogs.com/kongshuo/p/16618008.html用户名 admin 密码 redhat 创建…

    Linux 2023年6月8日
    0123
  • [20220104]in list 几种写法性能测试.txt

    [20220104]in list 几种写法性能测试.txt –//以前写过几种in list的写法,从来没有测试过这几种方法的性能测试看看. 1.环境:SCOTT@b…

    Linux 2023年6月13日
    061
  • ret2syscall

    博客网址:www.shicoder.top微信:18223081347欢迎加群聊天 :452380935 这一次我们来深入分析下更难的栈溢出题目 ret2syscall 首先还是先…

    Linux 2023年6月13日
    0132
  • 原来这就是网络

    你是一台电脑,你的名字叫A,很久很久之前,你不与任何其他电脑相连接,孤苦伶仃。 直到有一天,你希望与另一台电脑B建立连接,于是你们各开了一个网口,用一根网线连接了起来。 用一根网线…

    Linux 2023年6月14日
    0116
  • js学习笔记之for循环

    for 循环是在您希望创建循环时经常使用的工具。 for 循环的语法如下: for (语句 1; 语句 2; 语句 3) { 要执行的代码块 } 语句 1 在循环(代码块)开始之前…

    Linux 2023年6月13日
    079
  • RPA人力资源简历筛选机器人

    简历自动筛选及分析机器人,支持前程无忧、猎聘 1、自动登录招聘网站 2、自动填充简历筛选条件 3、RPA依次读取所筛选的简历信息 4、自动将简历数据复制到本地文档中 5、完成简历信…

    Linux 2023年6月7日
    0111
  • [云原生]Kubernetes-数据存储(第8章)

    一、基本存储 1.1 EmptyDir 1.2 HostPath 1.3 NFS 二、高级存储 2.1 PV 2.2 PVC 2.3 生命周期 三、配置存储 3.1 ConfigM…

    Linux 2023年6月13日
    079
  • 二进制插入

    二进制插入__牛客网 (nowcoder.com) 题意为 让m插入到n的第j位到第i位 方法1: class BinInsert { public: int binInsert(…

    Linux 2023年6月13日
    0105
  • 华为ensp网络拓扑图使用MSTP、OSPF、DHCP、端口聚合以及PPP(CHAP认证)

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月7日
    0106
  • Windows下PowerShell监控Keepalived

    一、 背景 某数据库服务器为CentOS,想要监控Keepalived的VIP是否有问题,通过邮件进行报警,但这台机器不能上外网,现在只能在Windows下通过PowerShell…

    Linux 2023年5月28日
    0101
  • Redis源码学习

    为什么要阅读Redis源码? 主要原因就是『简洁』。如果你用源码编译过Redis,你会发现十分轻快,一步到位。其他语言的开发者可能不会了解这种痛,作为C/C++程序员,如果你源码编…

    Linux 2023年5月28日
    0100
  • SSH_远程终端

    SSH 远程服务 目的 Windwos 和 Linux 的终端控制系统or传送传送文件, 当然 Linux和Linux 以及 Windwos 和 Windwos 之间的通信都是OK…

    Linux 2023年6月7日
    093
  • SLF4J 日志门面

    SLF4J( Simple Logging Facade For Java),即 简单日志门面。主要是为了给 Java 日志访问提供一套标准、规范的 API 框架,其主要意义在于提…

    Linux 2023年6月8日
    0100
  • [转帖]shell学习之shell执行方式及排错

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年5月28日
    096
  • WPF 已知问题 资源字典树引用与资源寻找的坑

    大家都知道,在 WPF 里面,可以让资源字典合并其他资源字典,从而定义出资源字典引用树。然而在资源字典引用树里面,如果没有理清关系,将可以作出一个超级复杂的引用关系网。如果在性能优…

    Linux 2023年6月6日
    0113
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球