2023年12月18日发(作者:)

1.简述OpenSSL,包括提供的功能(最少300字,最多800字)2.配置OpenSSL安装环境(指导资料一)简要回答下列问题(1)Perl是什么(2)Makefile文件的作用是什么?3.调试OpenSSL库的编程环境,也就是说,可以在你的程序中使用Openssl库提供的加密解密算法程序(3)调通例子程序(4)中文说明例子程序中关键函数所完成的功能,例如OpenSSL_add_all_digests()(5)实现三重DES加密、RSA、MD5加密算法,并绘制时间/明文长度图,进行三种算法的比较4.使用Openssl自带的文件创建CA简要回答下列问题(6)什么是CA?(7)创建CA过程中,关键问题是什么?实验内容:一、简述OpenSSLOpenSSL是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。是一个开放源代码的实现了SSL及相关加密技术的软件包。其作用有:a)生成私有密钥.b)生成证书,即数字签名证书,它包含一个公有密钥,可以用来单向的加密和解密数据.即,使用公钥加密的数据,只能使用私有密钥解密.使用私钥加密的数据,可以使用公钥来解密.c)计算信息摘要.d)SSL/TLS客户端和服务器端测试.e)处理S/MIME标记和邮件的加密.基本功能:OpenSSL整个软件包大概可以分成三个主要的功能部分:SSL协议库、应用程序以及密码算法库。OpenSSL的目录结构自然也是围绕这三个功能部分进行规划的。OpenSSL提供的功能囊括了主要的密码算法、常用的密钥和证书封装管理功能以及SSL协议,并提供了丰富的应用程序供测。辅助功能:BIO机制是OpenSSL提供的一种高层IO接口,该接口封装了几乎所有类型的IO接口,如内存访问、文件访问以及Socket等。这使得代码的重用性大幅度提高,OpenSSL提供API的复杂性也降低了很多。OpenSSL对于随机数的生成和管理也提供了一整套的解决方法和支持API函数。随机数的好坏是决定一个密钥是否安全的重要前提。OpenSSL还提供了其它的一些辅助功能,如从口令生成密钥的API,证书签发和管理中的配置文件机制等等。二、配置OpenSSL安装环境(1)Perl是什么?Perl,一种功能丰富的计算机程序语言,运行在超过100种计算机平台上,适用广泛,从大型机到便携设备,从快速原型创建到大规模可扩展开发。最重要的特性是它内部集成了正则表达式的功能,以及巨大的第三方代码库CPAN。与脚本语言一样,Perl不需要编译器和链接器来运行代码,你要做的只是写出程序并告诉

Perl来运行而已。这意味着Perl对于小的编程问题的快速解决方案和为大型事件创建原型来测试潜在的解决方案是十分理想的(2)Makefile文件的作用是什么?OpenSSL的配置脚本与大多数典型的软件包不同,它有自己的一套规则。详细的安装信息位于源码树下的INSTALLConfigure(特别是"PROCESS_ARGS"段)文件中。config脚本检查系统环境并调用Configure完成配置,因此配置选项是通过config脚本向Configure传递的。事实上config脚本的作用相当于,所以如果你想直接调用Configure的话就一定要正确指定"操作系统-目标平台"(笔者推荐这个用法)。所有可用的目标机器列表可以使用"./ConfigureLIST"命令获取。Configure脚本除了根据生成Makefile之外,还在crypto/opensslconf.h中定义了许多宏(基于crypto/)。三、调试OpenSSL库的编程环境按照实验指导对OpenSSL库进行编译。编译完成,在$opensslout32dll目录下生成库文件、动态链接库文件、Openssl执行文件和测试程序

四、使用Openssl自带的文件创建CA简要回答下列问题(1)什么是CA?证书。CA也拥有一个证书(内含公钥和私钥)。网上的公众用户通过验证CA的签字从而信任CA,任何人都可以得到CA的证书(含公钥),用以验证它所签发的证书。信息发送者用其私钥对从所传报文中提取出的特征数据(或称数字指纹)进行RSA算法操作,以保证发信人无法抵赖曾发过该信息(即不可抵赖性),同时也确保信息报文在传递过程中未被篡改(即完整性)。当信息接收者收到报文后,就可以用发送者的公钥对数字签名进行验证。在数字签名中有重要作用的数字指纹是通过一类特殊的散列函数(HASH函数)生成的。(2)创建CA过程中,关键问题是什么?生成密钥及证书持有者的证书信息实现步骤:(1)根据实验指导书,配置vs2010的项目工程文件。测试解密算法。运行结果如下:

(2)中文说明例子程序中关键函数所完成的功能,例如OpenSSL_add_all_digests()L_add_all_digests();添加所有的摘要算法的表。加载单向散列函数_get_digestbyname();通过指定的名称,返回一个evp_md结构。根据给定的算法名称返回一个相应的EVP_MD算法结构。摘要算法在使用之前必须进行初始化,如使用Openssl_add_all_digests进行初始化。如果调用不成功,返回NULL。_MD_CTX_init();该函数初始化一个EVP_MD_CTX结构_DigestInit_ex();该函数使用参数impl所指向的ENGINE设置该信息摘要结构体,参数ctx在调用本函数之前必须经过初始化。参数type一般是使用象EVP_sha1这样的函数的返回值。如果impl为NULL,那么就会使用缺省实现的信息摘要函数。大多数应用程序里面impl是设置为NULL的。操作成功返回1,否则返回0。_DigestUpdate();该函数将参数d中的cnt字节数据进行信息摘要到ctx结构中去,该函数可以被调用多次,用以对更多的数据进行信息摘要。操作成功返回1,否则返回0。_DigestFinal_ex();该函数使用参数impl所指向的ENGINE设置该信息摘要结构体,参数ctx在调用本函数之前必须经过初始化。参数type一般是使用象EVP_sha1这样的函数的返回值。如果impl为NULL,那么就会使用缺省实现的信息摘要函数。大多数应用程序里面impl是设置为NULL的。操作成功返回1,否则返回0。_MD_CTX_cleanup();清除一个信息摘要结构,该函数应该在一个信息摘要结构使用后不再需要的时候调用。(3)调通例子程序(3个,实验报告+课堂两个例子)实验结果在下图所示。(4)实现三重DES加密、RSA、MD5加密算法,并绘制时间/明文长度图,进行三种算法的比较三重DES加密:算法流程图:

算法代码:voidDES_ede3_cbcm_encrypt(constunsignedchar*in,unsignedchar*out,longlength,DES_key_schedule*ks1,DES_key_schedule*ks2,DES_key_schedule*ks3,DES_cblock*ivec1,DES_cblock*ivec2,intenc);#include"stdafx.h"#include"openssl/des.h"#include"string.h"#include"stdio.h"#include"openssl/evp.h"#include"openssl/x509.h"voidtEVP_Encrypt(){unsignedcharkey[EVP_MAX_KEY_LENGTH];//密钥unsignedchariv[EVP_MAX_KEY_LENGTH];//初始化向量EVP_CIPHER_CTXctx;//EVP算法上下文unsignedcharout[1024];//输出密文缓冲区unsignedcharout1[1024];//输出明文缓冲区intoutl;//密文长度intoutltmp;intoutl1;//明文长度intoutltmp1;char*msg="HelloOpenSSL!WeareGROUPmod2!!!";//待加密的数据intrv;intrv1;inti;//加密过程//设置key和iv(可以采用随机数和可以是用户输入)

for(i=0;i<24;i++){key[i]=i;}for(i=0;i<8;i++){iv[i]=i;}//初始化密码算法结构体EVP_CIPHER_CTX_init(&ctx);//设置算法和密钥rv=EVP_EncryptInit_ex(&ctx,EVP_des_ede3_cbc(),NULL,key,iv);if(rv!=1){printf("Errn");return;}//数据加密rv=EVP_EncryptUpdate(&ctx,out,&outl,(constunsignedchar*)msg,strlen(msg));if(rv!=1){printf("Errn");return;}//结束数据加密,把剩余数据输出。rv=EVP_EncryptFinal_ex(&ctx,out+outl,&outltmp);if(rv!=1){printf("Errn");return;}outl=outl+outltmp;printf("原文为:%sn",msg);//打印输出密文printf("密文长度:%dn密文数据:n",outl);for(i=0;i

printf("Err1n");return;}rv1=EVP_DecryptUpdate(&ctx,out1,&outl1,out,outl);if(rv1!=1){printf("Err2n");return;}rv1=EVP_DecryptFinal_ex(&ctx,out1+outl1,&outltmp1);if(rv1!=1){printf("Err3n");return;}outl1=outl1+outltmp1;//打印输出明文printf("nn原文长度:%dn原文数据:n",outl1);for(i=0;i

算法代码:#define_GNU_SOURCE#include#include#include#include#include#include"openssl/md5.h"MD5_CTXmd5_ctx;staticintMD5mod(constchar*str,intlength,intmod){charsign[16]={0};MD5_Init(&md5_ctx);MD5_Update(&md5_ctx,str,length);MD5_Final(sign,&md5_ctx);intsum=0;for(inti=0;i<16;i++){sum+=(sign[i]&0xff);}intoffset=sum%mod;returnoffset;}intmain(intargc,char**argv){if(argc<4){fprintf(stderr,"%snuminfileoutfilen",argv[0]);exit(-1);

}intnum=atoi(argv[1]);if(num<=0){fprintf(stderr,"ERROR:numerror:%sn",argv[1]);exit(-1);}FILE*in=fopen(argv[2],"r");if(in==NULL){perror("fopen");fprintf(stderr,"ERROR:infileerror:%sn",argv[2]);exit(-1);}FILE**OUT=(FILE**)malloc(sizeof(FILE*)*num);for(inti=0;i

算法代码:#include"stdafx.h"#include"openssl/des.h"#include"string.h"#include#include#include#include#include#include#include#include#include#includeusingnamespacestd;#pragmacomment(lib,"")#pragmacomment(lib,"")voidgenerateKey(){/*生成公钥*/

RSA*rsa=RSA_generate_key(1024,RSA_F4,NULL,NULL);BIO*bp=BIO_new(BIO_s_file());BIO_write_filename(bp,"");PEM_write_bio_RSAPublicKey(bp,rsa);BIO_free_all(bp);/*生成私钥*/charpasswd[]="1234";bp=BIO_new_file("","w+");PEM_write_bio_RSAPrivateKey(bp,rsa,EVP_des_ede3(),(unsignedchar*)passwd,4,NULL,NULL);BIO_free_all(bp);RSA_free(rsa);}std::stringbio_read_privateKey(stringdata){OpenSSL_add_all_algorithms();BIO*bp=BIO_new(BIO_s_file());BIO_read_filename(bp,"");charpasswd[]="1234";RSA*rsaK=PEM_read_bio_RSAPrivateKey(bp,NULL,NULL,passwd);intnLen=RSA_size(rsaK);//printf("len:%dn",nLen);char*pEncode=newchar[nLen+1];intret=RSA_private_decrypt((),(constunsignedchar*)data.c_str(),(unsignedchar*)pEncode,rsaK,RSA_PKCS1_PADDING);std::stringstrRet;if(ret>=0){strRet=std::string(pEncode,ret);//printf("%s",strRet.c_str());}delete[]pEncode;CRYPTO_cleanup_all_ex_data();BIO_free_all(bp);RSA_free(rsaK);returnstrRet;}std::stringbio_read_publicKey(stringdata){OpenSSL_add_all_algorithms();BIO*bp=BIO_new(BIO_s_file());BIO_read_filename(bp,"");RSA*rsaK=PEM_read_bio_RSAPublicKey(bp,NULL,NULL,NULL);intnLen=RSA_size(rsaK);

char*pEncode=newchar[nLen+1];intret=RSA_public_encrypt((),(constunsignedchar*)data.c_str(),(unsignedchar*)pEncode,rsaK,RSA_PKCS1_PADDING);std::stringstrRet;if(ret>=0){strRet=std::string(pEncode,ret);//printf("%sn",strRet.c_str());}delete[]pEncode;CRYPTO_cleanup_all_ex_data();BIO_free_all(bp);RSA_free(rsaK);returnstrRet;}intmain(){char*str="helloworld";generateKey();printf("原文:%sn",str);std::stringm=bio_read_publicKey(str);printf("密文:n%snn",m.c_str());stringmiwen=m;std::stringc=bio_read_privateKey(miwen);printf("解密后:n%snn",c.c_str());clock_tt,t1,t2;t1=clock();for(inti=0;i<10000;i++){std::stringm=bio_read_publicKey(str);}t2=clock();t=t2-t1;printf("%f",((float)t)/10000);return0;}实验结果:例子程序:

三重DES加密解密和时间统计截图

RSA加密解密和时间统计截图DES,MD5,RSA算法,时间/明文长度关系图:

结论分析:根据理论分析,三种算法对于明文长度和算法运行时间的关系,是随着明文长度的增加,运行时间指数增加。通过实验数据分析,随着明文长度的增加,时间随之增加,很好的印证了理论分析。三种算法相比较而言,MD5、3DES的运行时间要远远快与RSA算法的,同时,通过实验数据可以发现,MD5算法的运行速度也同样快于3DES,具有较优的速度。在试验中,RSA的运行时间远大于其他两个算法,可能存在系统误差,或算法函数不优等原因,下一步的研究方向就是改进RSA的程序,同时避免系统所造成的误差。