2017-2018-1 20155229 实验五 《通讯协议设计》

实验目的

通过学习openssl,了解openssl,并且能够通过它来实现密码算法的印证

实验步骤

实验五 通讯协议设计-1

  • 在Ubuntu中完成 http://www.cnblogs.com/rocedu/p/5087623.html 中的作业

Linux下OpenSSL的安装与使用

OpenSSL简介
  • 是一个安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。
  • OpenSSL整个软件包大概可以分成三个主要的功能部分:密码算法库、SSL协议库、应用程序
  • SSL是Secure Sockets Layer(安全套接层协议)的缩写,可以在Internet上提供秘密性传输。SSL能使用户/服务器应用之间的通信不被攻击者窃听,并且始终对服务器进行认证,还可选择对用户进行认证。SSL协议要求建立在可靠的传输层协议(TCP)之上。
  • 密码算法库是一个强大完整的密码算法库,它是OpenSSL的基础部分,它实现了目前大部分主流的密码算法和标准。主要包括对称算法、非对称算法、散列算法、数字签名和认证、X509数字证书标准、PKCS12、PKCS7等标准。此外,OpenSSL还实现了DSS标准中规定的两种信息摘要算法DSS和DSS1。
  • OpenSSL的应用程序主要包括密钥生成、证书管理、格式转换、数据加密和签名、SSL测试以及其它辅助配置功能。
下载openSSL
  • 在官网下载程序 http://www.openssl.org/
  • 使用unzip openssl-master.zip对压缩包进行解压
  • 运行

./config生成私钥:make openssl rsa -in private.pem -out public.pem -pubout 查看密钥信息:  openssl rsa -noout -text -in privatekey_test.pem用生成的公钥加密 test:make testmake install

使用man openssl查看帮助文档

运用老师给的测试代码test.c


#include <stdio.h>
#include <openssl/evp.h>int main(){OpenSSL_add_all_algorithms();return 0;
}

使用gcc -o test test.c -I /usr/local/ssl/inlcude /usr/local/ssl/lib -ldl -lpthread命令编译

执行./test;echo $?,执行的结果为0

基于Socket实现TCP通信,一人实现服务器,一人实现客户端

研究OpenSSL算法,测试对称算法中的AES,非对称算法中的RSA,Hash算法中的MD5
AES
//设置加密密钥,使用字符缓冲区
int AES_set_encrypt_key(const unsigned char *userKey,const int  bits,AES_KEY *key);//设置解密密钥,同样适用字符缓冲区
int AES_set_decrypt_key(const unsigned char *userKey,const int  bits,AES_KEY *key);//加解密的接口,通过最后的enc来区分是加密还是解密操作
//每次执行AES_cbc_encrypt后,iv(向量)会被更新,
//所以需要自己保存它。
void AES_cbc_encrypt(const unsigned char
*in, unsigned char *out,const unsigned long length,const AES_KEY *key,unsigned char *ivec,const int  enc);

RSA
  • 生成一个密钥:

openssl genrsa -out test.key 1024

这里-out指定生成文件的。需要注意的是这个文件包含了公钥和密钥两部分,也就是说这个文件即可用来加密也可以用来解密。后面的1024是生成密钥的长度。

  • openssl可以将这个文件中的公钥提取出来:

openssl rsa -in test.key -pubout -out test_pub.key

-in指定输入文件,-out指定提取生成公钥的文件名。至此,我们手上就有了一个公钥,一个私钥(包含公钥)。现在可以将用公钥来加密文件了。

在目录中创建一个文本文件,然后利用此前生成的公钥加密文件:
openssl rsautl -encrypt -in xxx -inkey test_pub.key -pubin -out xxx

-in指定要加密的文件,-inkey指定密钥,-pubin表明是用纯公钥文件加密,-out为加密后的文件。

  • 解密文件:

openssl rsautl -decrypt -in xxx -inkey test.key -out xxx

-in指定被加密的文件,-inkey指定私钥文件,-out为解密后的文件。

*RSA_generate_key(int bits, unsigned long e_value,void (*callback)(int,int,void *), void *cb_arg)//生成RSA密钥,bits是模数比特数,e_value是公钥指数e,callback回调函数由用户实现,用于干预密钥生成过程中的一些运算,可为空。

MD5

openssl MD5 接口

int MD5_Init(MD5_CTX *c);
//初始化MD5上下文结构int MD5_Update(MD5_CTX *c, const void *data, size_t len);
//刷新MD5,将文件连续数据分片放入进行MD5刷新。int MD5_Final(unsigned char *md, MD5_CTX *c);
//产生最终的MD5数据unsigned char *MD5(const unsigned char *d, size_t n, unsigned char *md);
//直接产生字符串的MD5

实验五 通讯协议设计-2

  • 在Ubuntu中实现对实验二中的“wc服务器”通过混合密码系统进行防护

openssl实现服务器和客户端

ssl的初始化

使用openssl提供的函数设置算法、证书等。

  • 创建根证私钥命令:openssl genrsa -out root-key.key 1024

  • 创建根证书请求文件命令:
    openssl req -new -out root-req.csr -key root-key.key -keyform PEM

  • 要求校验对方证书
    SSL_CTX_set_verify(ctx,SSL_VERIFY_PEER,NULL);

  • 加载CA的证书
    EXIT_IF_TRUE(!SSL_CTX_load_verify_locations(ctx, "cacert.cer", NULL));

  • 加载自己的证书
    EXIT_IF_TRUE(SSL_CTX_use_certificate_file(ctx,"client.cer",SSL_FILETYPE_PEM) <= 0) ;

  • 加载自己的私钥
    EXIT_IF_TRUE(SSL_CTX_use_PrivateKey_file(ctx, "client.key",SSL_FILETYPE_PEM)<= 0) ;

主要代码为


SSL_load_error_strings(); /*为打印调试信息作准备*/
OpenSSL_add_ssl_algorithms(); /*初始化*///meth = TLSv1_server_method(); /*采用什么协议(SSLv2/SSLv3/TLSv1)在此指定*/
//注意这里是server,客户端那里会是client
ctx = SSL_CTX_new (TLSv1_server_method());
CHK_NULL(ctx);SSL_CTX_set_verify(ctx,SSL_VERIFY_PEER,NULL); /*验证与否*/
SSL_CTX_load_verify_locations(ctx,CACERT,NULL); /*若验证,则放置CA证书*/if (SSL_CTX_use_certificate_file(ctx, CERTF, SSL_FILETYPE_PEM) <= 0) {ERR_print_errors_fp(stderr);getchar();exit(3);
}if (SSL_CTX_use_PrivateKey_file(ctx, KEYF, SSL_FILETYPE_PEM) <= 0) {ERR_print_errors_fp(stdout);getchar();exit(4);
}if (!SSL_CTX_check_private_key(ctx)) {printf("Private key does not match the certificate public keyn");getchar();exit(5);
}SSL_CTX_set_cipher_list(ctx,"RC4-MD5"); 
ssl连接通信

生成客户端文件:

1.生成客户端key
openssl genrsa -out client-key.key 1024

2.生成客户端请求文件
openssl req -new -out client-req.csr -key client-key.key

3.生成客户端证书(root证书,rootkey,客户端key,客户端请求文件这4个生成客户端证书)
openssl x509 -req -in client-req.csr -out client-cert.cer -signkey client-key.key -CA root-cert.cer -CAkey root-key.key -CAcreateserial -days 3650

4.生成客户端p12格式根证书
openssl pkcs12 -export -clcerts -in client-cert.cer -inkey client-key.key -out client.p12

生成服务端文件:
1.生成服务端key
openssl genrsa -out server-key.key 1024
2.生成服务端请求文件
openssl req -new -out server-req.csr -key server-key.key
3.生成服务端证书(root证书,rootkey,客户端key,客户端请求文件这4个生成客户端证书)
openssl x509 -req -in server-req.csr -out server-cert.cer -signkey server-key.key -CA root-cert.cer
-CAkey root-key.key -CAcreateserial -days 3650
4.生成服务端p12格式根证书
openssl pkcs12 -export -clcerts -in server-cert.cer -inkey server-key.key -out server.p12

建立TCP套接字,并且进入监听,当接收到客户端连接请求后,使用accept建立和客户端通信的套接字s,从初始化的SSL_CTX创建一个SSL,将该SSL和与客户端通信的套接字s绑定,然后使用SSL_accept建立和客户端的SSL连接,如果建立成功就可以检查客户端的证书并获取客户端的证书信息,实现相互认证。之后,可以使用异步通信机制处理该SSL连接的消息。原理图如下图所示:

实验结果截图:

实验五 通讯协议设计-3(未完成)

实验感想与体会

通过本次实验,对openssl有了深入的了解,openssl作为一个基于密码学的安全开发包,提供的功能相当的强大和全面,囊括了主要的密码算法和常用的密钥和证书封装管理功能以及ssl'协议。在实验中,对RSA、AES、MD5等密码算法一一进行了验证,同时还学习了openssl实现双向认证的内容,再一次深深的感受到了openssl对于密码学的方便。

转载于:https://www.cnblogs.com/fyhtvxq/p/8051762.html

2017-2018-1 20155229 实验五 《通讯协议设计》相关推荐

  1. 2017-2018-1 20155327 实验五 通讯协议设计

    2017-2018-1 20155327 实验五 通讯协议设计 实验一: 实验要求: 在Ubuntu中完成 http://www.cnblogs.com/rocedu/p/5087623.html 中 ...

  2. 2018-2019-1 20165212 实验五 通讯协议设计

    2018-2019-1 20165212 实验五 通讯协议设计 OpenSSL简介 OpenSSL是为网络通信提供安全及数据完整性的一种安全协议,囊括了主要的密码算法.常用的密钥和证书封装管理功能以及 ...

  3. 2017-2018-1 201553334 实验五 通讯协议设计

    2017-2018-1 201553334 实验五 通讯协议设计 1.在Ubuntu中完成 http://www.cnblogs.com/rocedu/p/5087623.html 中的作业 提交运行 ...

  4. 2017-2018-1 20155222 201552228 实验五 通讯协议设计

    2017-2018-1 20155222 201552228 实验五 通讯协议设计 实验内容和要求 通讯协议设计-1 在Ubuntu中完成 http://www.cnblogs.com/rocedu/ ...

  5. 2018-2019-1 20165201 实验五 通讯协议设计

    2018-2019-1 20165201 实验五 通讯协议设计 实验五 通讯协议设计-1 任务详情 在Ubuntu中完成 http://www.cnblogs.com/rocedu/p/5087623 ...

  6. 2018-2019-1 20165318 20165326 实验五 通讯协议设计

    2018-2019-1 20165318 20165326 实验五 通讯协议设计 目录 实验内容 问题及解决 参考资料 实验内容 任务一 在Ubuntu中完成作业 openSSL OpenSSL是一个 ...

  7. 2017-2018-1 20155201 实验五 通讯协议设计

    2017-2018-1 20155201 实验五 固件程序设计 一.实验内容 安装OpenSSL环境,并编写测试代码验证无误 研究OpenSSL算法,测试对称算法中的AES,非对称算法中的RSA,Ha ...

  8. 2018-2019-1 20165323 20165333 20165336 实验五 通讯协议设计

    任务一.Linux下OpenSSL的安装与使用 在Ubuntu中完成 http://www.cnblogs.com/rocedu/p/5087623.html 中的作业 OpenSSL是一套用于SSL ...

  9. 2018-2019-1 20165303 实验五 通讯协议设计

    任务一 Linux下OpenSSL的安装与使用 前往OpenSSL官网,选择打开OpenSSL源码下载地址,按照下图所示方法下载压缩包"openssl-master.zip Linux下使用 ...

  10. 2018-2019-1 20165227 20165228 20165237 实验五 通讯协议设计

    小组成员:20165227朱越.20165228苏祚堃.20165237方若鸿 小组博客链接:https://www.cnblogs.com/cloud795/p/10126478.html 转载于: ...

最新文章

  1. 使用logrotate管理nginx日志文件
  2. 在SQL Server中调用.NET程序集
  3. 我翻译的一篇文章,OO设计中对象的创建和使用
  4. 英特尔挖走苹果M1芯片功臣,他主导苹果放弃x86架构
  5. pre_forum_thread 主题表跟pre_forum_thread内容表是用哪个字段对应起来的?
  6. c++新特性11 (10)shared_ptr六”构造函数unique_ptr参数“
  7. Spring配置文件中bean标签的scope属性
  8. 【Cef编译】 CefSharp编译失败,检测到“RuntimeLibrary”的不匹配项: 值“MT_StaticRelease”不匹配值“MD_DynamicRelease”...
  9. opencv颜色识别_opencv-python污水颜色识别
  10. swt matlab 中 swa,Matlab小波工具箱的使用3
  11. 通过真实项目截图讲解MDT 2010部署windows 7的具体过程(3)
  12. matlab各种文件类型,MATLAB中的文件类型总结
  13. stm32毕业设计 单片机指纹识别考勤系统
  14. CTFshou wed文件上传
  15. 世界顶级企业的数据中台实践剖析
  16. java操作Excel:技巧
  17. 数据库密码忘了如何修改
  18. java 生成随机编码_Java生成随机编码
  19. python|简单实现英文单词大小写转化
  20. 洗牌问题(C语言实现)

热门文章

  1. (九)企业分布式微服务云SpringCloud SpringBoot mybatis-服务链路追踪(Spring Cloud Sleuth)...
  2. Oracle数据库merge into的使用,存在则更新,不存在则插入
  3. Architecture(5)电商APP组件化探索
  4. Vue.js 判断对象属性是否存,不存在添加
  5. ProgressDialog弹出时的底色变暗(转)
  6. 最強御主人様!-Mighty My Master-全年龄汉化补丁(第二版修正)
  7. 利用iTextSharp把DataTable导出为PDF和RTF(Rich Text Format)文件
  8. 安卓系统怎么安装软件_「软件」怎么在虚拟机里安装系统
  9. 设计模式学习之--Singleton(单例)模式
  10. OCP最新题库052考题解析及答案-第37题