网络安全实验.docx_第1页
网络安全实验.docx_第2页
网络安全实验.docx_第3页
网络安全实验.docx_第4页
网络安全实验.docx_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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的配置脚本与大多数典型的软件包不同,它有自己的一套规则。详细的安装信息位于源码树下的 INSTALL Configure(特别是PROCESS_ARGS段) Makefile.shared M 文件中。config 脚本检查系统环境并调用 Configure 完成配置,因此配置选项是通过 config 脚本向 Configure 传递的。事实上 config 脚本的作用相当于 config.guess ,所以如果你想直接调用 Configure 的话就一定要正确指定操作系统-目标平台(笔者推荐这个用法)。所有可用的目标机器列表可以使用./Configure LIST命令获取。Configure 脚本除了根据 M 生成 Makefile 之外,还在 crypto/opensslconf.h 中定义了许多宏(基于 crypto/opensslconf.h.in)。三、 调试OpenSSL库的编程环境按照实验指导对OpenSSL库进行编译。编译完成,在$opensslout32dll 目录下生成库文件、动态链接库文件、Openssl执行文件和测试程序四、 使用Openssl自带的文件创建CA简要回答下列问题(1) 什么是CA?证书。CA 也拥有一个证书(内含公钥和私钥)。网上的公众用户通过验证 CA 的签字从而信任 CA ,任何人都可以得到 CA 的证书(含公钥),用以验证它所签发的证书。信息发送者用其私钥对从所传报文中提取出的特征数据(或称数字指纹)进行RSA算法操作,以保证发信人无法抵赖曾发过该信息(即不可抵赖性),同时也确保信息报文在传递过程中未被篡改(即完整性)。当信息接收者收到报文后,就可以用发送者的公钥对数字签名进行验证。在数字签名中有重要作用的数字指纹是通过一类特殊的散列函数(HASH函数) 生成的。(2) 创建CA过程中,关键问题是什么?生成密钥及证书持有者的证书信息实现步骤:(1) 根据实验指导书,配置vs2010的项目工程文件。测试解密算法。运行结果如下:(2) 中文说明例子程序中关键函数所完成的功能,例如OpenSSL_add_all_digests()A. OpenSSL_add_all_digests();添加所有的摘要算法的表。加载单向散列函数B. EVP_get_digestbyname();通过指定的名称,返回一个evp_md结构。根据给定的算法名称返回一个相应的EVP_MD算法结构。摘要算法在使用之前必须进行初始化,如使用Openssl_add_all_digests进行初始化。如果调用不成功,返回NULL。C. EVP_MD_CTX_init();该函数初始化一个EVP_MD_CTX结构D. EVP_DigestInit_ex();该函数使用参数impl所指向的ENGINE设置该信息摘要结构体,参数ctx在调用本函数之前必须经过初始化。参数type一般是使用象EVP_sha1这样的函数的返回值。如果impl为NULL,那么就会使用缺省实现的信息摘要函数。大多数应用程序里面impl是设置为NULL的。操作成功返回1,否则返回0。E. EVP_DigestUpdate();该函数将参数d中的cnt字节数据进行信息摘要到ctx结构中去,该函数可以被调用多次,用以对更多的数据进行信息摘要。操作成功返回1,否则返回0。 F. EVP_DigestFinal_ex(); 该函数使用参数impl所指向的ENGINE设置该信息摘要结构体,参数ctx在调用本函数之前必须经过初始化。参数type一般是使用象EVP_sha1这样的函数的返回值。如果impl为NULL,那么就会使用缺省实现的信息摘要函数。大多数应用程序里面impl是设置为NULL的。操作成功返回1,否则返回0。G. EVP_MD_CTX_cleanup();清除一个信息摘要结构,该函数应该在一个信息摘要结构使用后不再需要的时候调用。(3) 调通例子程序(3个,实验报告+课堂两个例子)实验结果在下图所示。(4) 实现三重DES加密、RSA、MD5加密算法,并绘制时间/明文长度图,进行三种算法的比较三重DES加密:算法流程图:算法代码:void DES_ede3_cbcm_encrypt(const unsigned char *in,unsigned char *out, long length, DES_key_schedule *ks1,DES_key_schedule *ks2, DES_key_schedule *ks3, DES_cblock *ivec1,DES_cblock *ivec2, int enc);#include stdafx.h#include openssl/des.h#include string.h#include stdio.h#include openssl/evp.h#include openssl/x509.h void tEVP_Encrypt()unsigned char keyEVP_MAX_KEY_LENGTH;/密钥unsigned char ivEVP_MAX_KEY_LENGTH;/初始化向量EVP_CIPHER_CTX ctx;/EVP算法上下文unsigned char out1024;/输出密文缓冲区unsigned char out11024;/输出明文缓冲区int outl;/密文长度int outltmp;int outl1;/明文长度int outltmp1;char *msg=Hello OpenSSL! We are GROUP mod 2!;/待加密的数据int rv;int rv1;int i;/加密过程/设置key和iv(可以采用随机数和可以是用户输入)for(i=0;i24;i+)keyi=i;for(i=0;i8;i+)ivi=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,(const unsigned char *)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;ioutl;i+)printf(0x%02x ,outi);printf(n);/解密过程rv1 = EVP_DecryptInit_ex(&ctx,EVP_des_ede3_cbc(),NULL,key,iv);if(rv1!=1)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;ioutl1;i+) printf(%c,out1i); printf(n);int _tmain(int argc, _TCHAR* argv)OpenSSL_add_all_algorithms();tEVP_Encrypt();return 0;MD5加密算法:算法流程图:算法代码:#define _GNU_SOURCE#include #include #include #include #include #include openssl/md5.hMD5_CTX md5_ctx;static int MD5mod(const char* str, int length, int mod) char sign16 = 0; MD5_Init(&md5_ctx); MD5_Update(&md5_ctx, str, length); MD5_Final(sign, &md5_ctx); int sum = 0; for (int i=0; i 16; i +) sum += (signi&0xff); int offset = sum % mod; return offset;int main(int argc, char* argv) if( argc 4) fprintf(stderr, %s num infile outfilen, argv0); exit(-1); int num = atoi(argv1) ; if( num = 0) fprintf(stderr, ERROR: num error: %sn, argv1); exit(-1); FILE* in = fopen(argv2, r); if( in = NULL) perror(fopen); fprintf(stderr, ERROR: infile error: %sn, argv2); exit(-1); FILE* OUT = (FILE*)malloc(sizeof(FILE*) * num); for(int i=0; inum; +i) char buf256 = 0; sprintf(buf, %s_%d, argv3, i); OUTi = fopen(buf, w); if( OUTi = NULL) perror(fopen); fprintf(stderr, ERROR: infile error: %sn, argv2); exit(-1); size_t len = 0; ssize_t read; char * line = NULL; while (read = getline(&line, &len, in) != -1) int klen = 0; while( klen read ) if( isspace( *(line+klen) ) break; klen+; fprintf(OUTMD5mod(line, klen, num), %s, line); if(line) free(line); return 0;RSA加密算法:算法流程图:算法代码:#include stdafx.h#include openssl/des.h#include string.h#include #include #include #include #include#include#include #include #include #include using namespace std;#pragma comment(lib, libeay32.lib)#pragma comment(lib, ssleay32.lib)void generateKey() /* 生成公钥 */RSA* rsa = RSA_generate_key( 1024, RSA_F4, NULL, NULL);BIO *bp = BIO_new( BIO_s_file() );BIO_write_filename( bp, public.pem );PEM_write_bio_RSAPublicKey(bp, rsa);BIO_free_all( bp );/* 生成私钥 */char passwd=1234;bp = BIO_new_file(private.pem, w+);PEM_write_bio_RSAPrivateKey(bp, rsa, EVP_des_ede3(), (unsigned char*)passwd, 4, NULL, NULL);BIO_free_all( bp );RSA_free(rsa);std:string bio_read_privateKey(string data) OpenSSL_add_all_algorithms(); BIO* bp = BIO_new( BIO_s_file() ); BIO_read_filename( bp, private.pem ); char passwd=1234; RSA* rsaK = PEM_read_bio_RSAPrivateKey( bp, NULL, NULL, passwd );int nLen = RSA_size(rsaK);/printf(len:%dn,nLen);char *pEncode = new charnLen + 1;int ret = RSA_private_decrypt(data.length(),(const unsigned char*)data.c_str(),(unsigned char *)pEncode,rsaK,RSA_PKCS1_PADDING);std:string strRet;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);return strRet;std:string bio_read_publicKey(string data)OpenSSL_add_all_algorithms(); BIO* bp = BIO_new( BIO_s_file() ); BIO_read_filename( bp, public.pem ); RSA* rsaK = PEM_read_bio_RSAPublicKey( bp, NULL, NULL, NULL );int nLen = RSA_size(rsaK);char *pEncode = new charnLen + 1;int ret = RSA_public_encrypt(data.length(),(const unsigned char*)data.c_str(),(unsigned char *)pEncode,rsaK,RSA_PKCS1_PADDING);std:string strRet;if (ret = 0)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论