




已阅读5页,还剩16页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
密码学综合实践设计说明书题 目: 基于openssl的文件安全传输 学 院: 专 业: 姓 名: 学 号: 指导教师: 2017年5月25日成绩评定标准及成绩1、 能按照格式进行写作,无抄袭现象(10分)2、 报告内容行文通畅,有条理性,无错别字,结构严谨。(10分)3、 能够按照数据结构课设的格式要求、排版要求和字数要求等,有需求分析,系统分析,详细设计,关键技术的介绍和参考文献。(10分)4、 在验收过程中,能合理的回答问题(20分)5、 软件能正常运行,实现所提出的功能(40分)6、 软件代码规范性较好(5分)7、 具有自己的创新或特色(5分) 总成绩: 摘 要本次密码学综合实践的课题为基于openssl的文件安全传输,openssl提供了众多的api接口,可以实现对文件的对称加解密,计算摘要,签名及签名验证等功能。本系统实现的双端通信功能保证了相互之间的文件传输,文件对称加解密保证了数据的安全性,文件签名和签名验证功能保证了数据的完整性。在界面制作上使用MFC图形化界面制作,使得有了更好的用户交互界面。关键词:对称加解密;文件传输;签名认证;MFC界面目录1.前言12.需求分析22.1软件功能需求分析22.2软件数据安全需求分析22.3 软件开发环境需求分析22.3.1 编程语言22.3.2 系统环境32.3.3 附加库需求32.4软件运行环境需求分析33.设计思想与实现43.1 软件系统全局分析43.2 软件流程图43.3 核心代码实现54. 软件运行测试与界面展示145. 问题与解决165.1 界面更新问题165.2 输出操作难点176. 结语177. 参考文献171.前言在确定了本次的综合实验的题目后,在本着提高专业技能,巩固基础知识的前提下,通过查阅资料,最终选择了使用C+语言的MFC图形化界面来完成本次课设,在确定了之后,便去图书馆找到了相关书籍,在以前面向对象思想的基础上,将本次程序设计分为了四部分:全局核心问题解决,代码实现,程序调试及优化,课程设计报告书书写。在本次实验的书写过程中,由于文件传输时的进制转换问题,在文件打开和最后的解密保存方面花了比较多的精力,最后在权衡之后使用了MFC专门的文件读写函数,较为完美的解决了此类问题。在文件加解密及签名签名认证方面在认真阅读了openssl函数详解资料和参考网上的实例两方面努力下,写出了比较完整的封装函数,在传输文件方面,使用socket连接并使用了多线程,较为高效的实现了文件传输。在代码书写方面,本次使用的MFC是基于对话框的,所以在界面上花了较少的时间,主要靠VS自动生成,将重心主要放在了功能函数的书写上,代码实现时间为两周。在完成了基本功能之后,进入调试和后期优化,在测试了诸多数据之后,发现本程序在AES-128-CBC模式下加密是会出现由于明文文件太小而出现的无法加密的情况,目前没有找到较为有效的解决办法。在后期对代码进行了添加注释,调整代码风格等操作,增加了代码的可读性。由于个人能力的局限性,此次系统设计必然有诸多不完善的地方,还请大家在阅读此文档和使用本软件时能够提出宝贵意见,使得系统更加完善,在此感谢。2017年5月25日星期四2.需求分析2.1软件功能需求分析本次设计的软件根据要求需要有以下功能:对称对密钥文件加解密,对称密钥用RSA公钥加密、私钥解密,签名及签名认证,双端通信并发送文件。可分为以下两大模块:计算模块:此模块实现数据的封装加密和解封解密操作,使用多线程封装,使得程序高效流畅通信模块:此模块实现两个客户端之间的相互通信,公钥和文件的传输,同样在端口监听时使用多线程来完成。2.2软件数据安全需求分析作为一款数据加密传输软件,其首要考虑的便是其在传输过程中的数据安全性,在本次软件设计上使用openssl提供的封装函数接口进行数据加解密,OpenSSL 是一个安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用,其由加拿大的Eric Yang等发起编写,本次使用的对称密钥加密方式为分组密码中的AES加密方式,在AES对称秘钥生成上使用随机生成的16位对称密钥进行加密,保证了数据的安全性。 2.3 软件开发环境需求分析2.3.1 编程语言本次系统在最初设计时,在了解了多方资料之后,选择使用C语言下的MFC进行本次系统的编程,其原因有以下几点。首先在分析了软件需求后,决定制作UI界面,在windows下的MFC有着较简便的基于对话框的界面编程,可以在短时间内做出功能比较满意的界面,这样就可以将重心放在核心编程上。C语言是一种计算机程序设计语言,它既具有高级语言的特点,又具有汇编语言的特点,应用范围广泛,具备很强的数据处理能力,它具有简洁紧凑、灵活方便、运算符丰富、数据类型丰富等优点。其次在MFC在VS中有着比较好的优化,使得添加变量等操作成为自动化的过程,大大减少了软件制作的周期,使得编程更加高效。2.3.2 系统环境在系统环境选择上选择windows的操作系统,并安装了VS2015和openssl,其中VS2015中安装了MFC的模块,使得可以使用VS进行MFC的基于对话框的软件编程。2.3.3 附加库需求由于课程软件设计的基本要求,本次软件设计使用openssl提供的密码算法库来对文件实行加解密操作。数据加密是信息信息传输中的一个重要组成部分.任何信息都以明文方式传输,确实是个很不安全的做法.所以需要对数据进行加密.将明文数据转换为密文数据,再进行传输.OpenSSL是一套用于SSL/TLS协议的加密工具,其作用有:1.生成私有密钥.2.生成证书,即数字签名证书,它包含一个公有密钥,可以用来单向的加密和解密数据.即,使用公钥加密的数据,只能使用私有密钥解密.使用私钥加密的数据,可以使用公钥来解密.3.计算信息摘要.4.SSL/TLS客户端和服务器端测试.5.处理S/MIME标记和邮件的加密.2.4软件运行环境需求分析 表2-1:需求环境需求选项要求CPUIntel Core i3 及以上处理器或具有相同性能其他厂家的cpu内存推荐2 G 或以上硬盘空间至少50 M 空间操作系统Windows2000以上或linux系统均可附加库Openssl软件包环境其他无 3.设计思想与实现3.1 软件系统全局分析本次系统软件使用MFC中基于对话框的开发模式进行开发,数据处理中使用多线程进行端口监听、文件传输、文件封装与解密,相互之间的通信连接使用MFC中的socket进行,文件操作方式为二进制流,可对大文件进行安全传输。3.2 软件流程图图3-1 软件流程图-客户端1图3-2 软件流程图-客户端23.3 核心代码实现1. 生成公私钥文件代码段:void CclientDlg:OnBnClickedButCreatkey()/ TODO: 在此添加控件通知处理程序代码/生成公钥和私钥文件 int Ret = generate_key_files(PUBLIC_KEY_FILE, PRIVATE_KEY_FILE, (const unsigned char *)RSA_PRIKEY_PSW, strlen(RSA_PRIKEY_PSW); if (Ret)AfxMessageBox(_T(生成RSA密钥失败!, 错误);elseAfxMessageBox(_T(生成RSA密钥成功!, 提示);GetDlgItem(IDC_BUT_SendPub)-EnableWindow(TRUE);实现:这是一段在MFC中的消息处理函数,其在用户点击ID为ButCreatkey的按钮时触发执行,调用已经在mycode.c中申明并实现功能的generate_key_files函数,其主要功能是生成一对公私钥对并保存为文件形式,在此处引用,并根据其返还值判断生成是否成功,然后发出弹窗信息。2. 发送公钥文件线程实现代码段:void CclientDlg:OnBnClickedButSendpub()/ TODO: 在此添加控件通知处理程序代码/发送RSA公钥到客户端AfxBeginThread(SndKeyThreadProc, this);UINT SndKeyThreadProc(LPVOID lpParameter)CclientDlg *pDlg=(CclientDlg *)lpParameter;CSocket Clientsock; /definition socket.DWORD IP;/创建Clientsock.Socket()Else/发送文件SYSTEMTIMEt;CStringstrInfo;GetLocalTime(&t);strInfo.Format(%2d:%2d:%2d 连接成功.正在等待发送公钥.,t.wHour,t.wMinute,t.wSecond);pDlg-SetRevBoxText(strInfo);WIN32_FIND_DATA FindFileData;CString strPathName; strPathName.Format(PUBLIC_KEY_FILE);FindClose(FindFirstFile(strPathName, &FindFileData);CFile file;if(!file.Open(strPathName, CFile:modeRead|CFile:typeBinary)UINT nSize = 0;UINT nSend = 0;char *szBuff = new charBUFFSIZE;while(nSize SetRevBoxText(strInfo);return 0;实现:此段代码实现将文件发送至指定IP的指定端口,其中IP和端口由用户指定,在此处使用多线程进行文件传输,在传输时,先与指定客户端的指定端口进行SOCKET连接,若此时对方端口也正在监听,则连接成功,然后进行二进制的文件传输操作,将公钥文件传输到对方服务器,完成文件传输之后,线程终止。3. 文件选择打开功能代码段:void CclientDlg:OnBnClickedButChoosefile()/ TODO: 在此添加控件通知处理程序代码CFileDialog fileDlg(TRUE);if(fileDlg.DoModal()=IDOK)CString str = fileDlg.GetPathName();/判断文件是否存在this-SetDlgItemText(IDC_EDIT3, str);实现:此段代码新建了一个MFC中的CFile类型的变量,然后通过其成员函数DoModal()来选择文件弹窗,最后在判断文件存在的情况下,将文件的绝对路径字符串放在了ID为IDC_EDIT3的文本编辑框中。4. 数字信封封装核心代码4.1 对称密钥加密 代码段:UCHAR * uAesKey = StringToHex(UCHAR*)strKey.GetBuffer();cirfile.Open(TEXT(./file/Skey), CFile:modeCreate | CFile:modeWrite);inputstream = (UCHAR*)malloc(128);Length = 128;memset(inputstream, 0, 128);size_t enc_len;Ret = rsa_key_encrypt(pkey, uAesKey, 16, inputstream, enc_len);if (Ret = 0)free(inputstream);strInfo.Format(_T(RSA加密失败, 失败值%d.rn, Ret);return ;data.type= SYM_KEY;data.length= (UINT)enc_len;cirfile.Write(inputstream,Length);strInfo = 2. 对称密钥加密成功.;SetRevBoxText(strInfo);cirfile.Close();free(inputstream);实现:此代码段先将获取到的对称密钥进行16进制编码,然后在./file/文件夹中打开Skey文件,如果没有此文件,则创建一个文件,然后将前面在文本框中获取到的对称密钥用接收到的对方公钥进行加密,将加密后的数据写入到已经打开的Skey文件中,关闭二进制文件,此操作在CreateDigitalEnvelope函数中有对密文的加密,签名文件的生成等相同的操作,具体代码见下文。4.2 用对称密钥加密文件代码段:inputstream = AES_Encrypt(UCHAR*)FileBuffer, &nSize, SymKey, evp_cipher);UCHAR* NewData = AES_Decrypt(inputstream, &nSize, SymKey, evp_cipher);data.type = CIPHER_DATA;data.length = Length;strInfo = 3. 文件数据加密成功.;SetRevBoxText(strInfo);/写入加密文件数据cirfile.Write(inputstream,nSize);cirfile.Close();实现:此段代码通过AES_Encrypt函数将前面已经打开的明文数据用对称密钥加密,此处的evp_cipher为加密方式,由界面中的用户选择决定,其主要有如下几类:EVP_aes_128_cbc()、EVP_aes_128_cfb1()、EVP_aes_128_cfb128()、EVP_aes_128_cfb8()、EVP_aes_128_ofb()、EVP_aes_128_cfb1()加密成功后,密文保存为cipher二进制文件。4.3 生成文件签名信息代码段:cirfile.Open(TEXT(./file/Sign), CFile:modeCreate | CFile:modeWrite);/Length = cirfile.GetLength();inputstream = (UCHAR*)malloc(Length);memset(inputstream, 0, Length);/cirfile.Read(inputstream, Length);CHAR* Digest_Value = (CHAR*)malloc(128);memset(Digest_Value, 0, 128);/Length = strlen(FileBuffer1);rsa_sign_md5(PRIVATE_KEY_FILE, (UCHAR*)RSA_PRIKEY_PSW, FileBuffer1,Length1, Digest_Value, (UINT*)&nSize);strInfo = 4. 数字签名写入成功.;SetRevBoxText(strInfo);/写入数字签名cirfile.Write(Digest_Value,nSize);cirfile.Close();实现:此代码段通过rsa_sign_md5()函数实现了将明文计算摘要,然后将摘要信息保存在Digest_Value变量里面,此处签名信息长度为128位。在后面,将摘要信息写入文件Sign中,作为将要发送给服务端的文件之一,至此数字封装的三个文件生成完毕,数字封装结束。5. 监听文件线程代码段:while (1)if(!Serve.Accept(Client) /等待接收 continue;SOCKADDR_IN client_in;intsock_in_len = sizeof(SOCKADDR_IN);getpeername(Client, (SOCKADDR*)&client_in, &sock_in_len);(CIPAddressCtrl*)pDlg-GetDlgItem(IDC_IPADDRESS_C1)-SetAddress(htonl(client_in.sin_addr.S_un.S_addr);WIN32_FIND_DATA FileInfo;CFile RecvivedFile;Client.Receive(&FileInfo, sizeof(FileInfo);RecvivedFile.Open(FileInfo.cFileName, CFile:modeWrite | CFile:modeCreate);RecvBuf = new charBUFFSIZE;intRecvivedNum = 0;DWORDnSize = 0;while ( nSize SetRevBoxText(strInfo);RecvivedFile.Close();Client.Close();Serve.Close();实现:本段代码实现将接收到的socket连接挂起,准备并接收文件,与发送文件的线程相结合使用,RecvivedNum=Client.Receive(RecvBuf,BUFFSIZE);RecvivedFile.Write(RecvBuf, RecvivedNum);实现读取文件并将文件写入的功能。6. 基础函数支撑6.1 AES加解密算法代码段:UCHAR* AES_Encrypt(UCHAR* in, int* DataLength, UCHAR* ucKey, EVP_CIPHER* evp_cipher)UCHAR* out = (UCHAR*)malloc(*DataLength)*3);if(!out)return NULL;EVP_CIPHER_CTX evp_cipher_ctx;/*下面对 EVP_CIPHER_CTX 结构体进行初始化*/OpenSSL_add_all_ciphers();/*如果不加入内部表则会初始化失败*/ 根据名称获取加密算法,如 AES-192-OFB 等/*如果使用 DES 加密则会出现无法完全解密的 bug 需要对最后一个分块进行解密调用 EVP_EncryptFinal_ex*/ EVP_CIPHER_CTX_init(&evp_cipher_ctx);/ 初始化加密算法if (1 != EVP_CipherInit_ex(&evp_cipher_ctx, evp_cipher, NULL, ucKey, NULL, 1)exit(EXIT_FAILURE);if (1 != EVP_CipherUpdate(&evp_cipher_ctx, out, DataLength, in, *DataLength)exit(EXIT_FAILURE);EVP_CIPHER_CTX_cleanup(&evp_cipher_ctx);EVP_cleanup();return out;实现:本段代码实现了AES的加密功能,其用来加密对称秘钥,在此段代码中,首先在函数中输入evp_cipher_ctx用来保存其加密方式,然后再通过EVP_CipherInit_ex、EVP_CipherUpdate两个函数进行主要的加密操作,与其相对应的解密操作在EVP_CipherInit_ex(&evp_cipher_ctx, evp_cipher, NULL, ucKey, NULL, 0)一句的最后一个参数定义了加解密,1为加密,0为解密。6.2 生成公私钥文件代码段:BIO *bp = BIO_new(BIO_s_file();if(NULL = bp)/printf(generate_key bio file new error!n);return -1;if(BIO_write_filename(bp, (void *)pub_keyfile) = 0)/printf(BIO_write_filename error!n);return -1;if(PEM_write_bio_RSAPublicKey(bp, rsa) != 1)/printf(PEM_write_bio_RSAPublicKey error!n);return -1;/ 公钥文件生成成功,释放资源/printf(Create public key ok!n);BIO_free_all(bp);/ 生成私钥文件bp = BIO_new_file(pri_keyfile, w+);if(NULL = bp)/printf(generate_key bio file new error2!n);return -1;if(PEM_write_bio_RSAPrivateKey(bp, rsa,EVP_des_ede3_ofb(), (unsigned char *)passwd, passwd_len, NULL, NULL) != 1)/printf(PEM_write_bio_RSAPublicKey error!n);return -1;分析:此段代码实现了生成公私钥文件的功能,其主要通过PEM_write_bio_RSAPublicKey(bp, rsa)将生成的公私钥信息写入相应的文件中,此段代码生成两个文件,公私钥文件各一个,其保存的文件名是由宏定义所定义的,其取了此工程的相对地址。4. 软件运行测试与界面展示5. 问题与解决5.1 文件打开,写入操作在文件打开操作中,刚开始使用File的文件操作方式,在写入文件或者打开时会出现错误,因为其读写方式的特殊性,其在读写时使用file.read()和file.write(),使得在文
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年无人机驾驶员职业技能考核试卷及答案(无人机操作规范与要求)
- 宫腔粘连考试试题及答案
- 设备人员面试题目及答案
- 飞机训练考试题及答案
- 2025年CAAC执照理论复习考试总题库及答案
- 高利贷借款合同模板全套(3篇)
- 房屋买卖双方签订的带抵押的正式协议
- 出纳岗位安全责任聘用合同
- 创新型农业技术研发成果转化合作补充合同
- 个体户食品加工厂员工劳动合同范本
- 众筹方案文案(3篇)
- 系统性风险压力测试框架-洞察阐释
- 子宫动脉栓塞术后护理常规
- 配电柜接线外包合同
- 高血钾与急救处理
- ktv陪酒小妹管理制度
- 铁塔组立施工方案
- 工程机械发动机课件
- 古茗员工测试题及答案
- 地下室混凝土收光合同5篇
- 专家讲座:小学数学新课程标准解读
评论
0/150
提交评论