【2018-2019-1】20165223 实验五 通讯协议设计
实验成员:20165223
实验名称:通讯协议设计
目录
一、实验目的
二、实验内容
二、实验总结
一、实验目的
1.了解OpenSSL
-
OpenSSL的简介
OpenSSL是一个SSL协议的开源工具包,采用C语言作为开发语言,现了安全套接字层(SSL v2/v3)和传输层安全(TLS v1)协议以及全强大的通用加密库,且具备了跨平台的能力,支持Unix/Linux、Windows、Mac OS等多种平台。 -
OpenSSL的组成和功能
(1)SSL协议库:The SSL Library(SSL、TLS开发代码库)
(2)密码算法库:The Crypto Library(密码学相关开发代码库)
(3)应用程序:Command Line Tool(命令行工具,提供CA、证书等功能) -
使用 man OpenSSL 命令查看功能
2.安装和使用OpenSSL
- 参考资料:Linux下OpenSSL的安装与使用
二、实验内容
任务一:通讯协议设计-1
(一)实验要求
1.在Ubuntu中完成 Linux下OpenSSL的安装与使用 中的作业
2.提交运行结果截图
(二)实验步骤
(1)OpenSSL的安装与测试
- 1.下载OpenSSL安装包,在Ubuntu中解压
- 下载:OpenSSL官网下载地址
- 解压:输入如下命令
$ tar xzvf openssl-1.1.0-pre1.tar.gz
- 2.安装OpenSSL
$ cd openssl-1.1.0-pre1
$ ./config
$ sudo make
$ sudo make install
$ make test //测试
- 3.编写测试代码
test_openssl.c
#include <stdio.h>
#include <openssl/evp.h>
int main(){
OpenSSL_add_all_algorithms();
return 0;
}
- 4.使用OpenSSL密码算法库编译运行
//编译
$ gcc -o test_openssl test_openssl.c -I /usr/local/ssl/include -L/usr/local/ssl/lib -lssl -lcrypto -ldl -lpthread
//运行,打印0
$ echo $?
注意要加上 -lssl
链接OpenSSL密码算法库,否则会报错
(2)Linux下OpenSSL的安装与使用中的作业
1.基于Socket实现TCP通信,实现服务器与客户端
2.研究OpenSSL算法,测试对称算法中的AES,非对称算法中的RSA,Hash算法中的MD5
3.选用合适的算法,基于混合密码系统实现对TCP通信进行机密性、完整性保护。
4.学有余力者,对系统进行安全性分析和改进。
首先了解一下OpenSSL算法的指令内容(man openssl)
- 对称算法
使用的标准命令为 enc
openssl enc -ciphername [-in filename] [-out filename] [-pass arg] [-e] [-d] [-a/-base64]
[-A] [-k password] [-kfile filename] [-K key] [-iv IV] [-S salt] [-salt] [-nosalt] [-z] [-md]
[-p] [-P] [-bufsize number] [-nopad] [-debug] [-none] [-engine id]
-in filename:指定要加密的文件存放路径
-out filename:指定加密后的文件存放路径
-salt:自动插入一个随机数作为文件内容加密,默认选项
-e:可以指明一种加密算法,若不指的话将使用默认加密算法
-d:解密,解密时也可以指定算法,若不指定则使用默认算法,但一定要与加密时的算法一致
-a/-base64:使用-base64位编码格式
- AES
openssl enc -aes-128-cbc -in plain.txt -out out.txt -pass pass:123456 //密码123456
- RSA
openssl rsa [-inform PEM|NET|DER] [-outform PEM|NET|DER] [-in filename] [-passin arg] [-out filename] [-passout arg]
[-sgckey] [-des] [-des3] [-idea] [-text] [-noout] [-modulus] [-check] [-pubin] [-pubout] [-engine id]
常用选项:
-in filename:指明私钥文件
-out filename:指明将提取出的公钥保存至指定文件中
-pubout:根据私钥提取出公钥
- MD5
openssl passwd -1 -in test.txt -salt 12345678
生成密码需要使用的标准命令为 passwd ,用法如下:
openssl passwd [-crypt] [-1] [-apr1] [-salt string] [-in file] [-stdin] [-noverify] [-quiet] [-table] {password}
常用选项有:
-1:使用md5加密算法
-salt string:加入随机数,最多8位随机数
-in file:对输入的文件内容进行加密
-stdion:对标准输入的内容进行加密
再实现作业中的内容
- 1.基于Socket实现TCP通信
- 2.使用OpenSSL算法,测试对称算法AES
- 3.使用OpenSSL算法,测试非对称算法RSA(生成私钥→生成公钥→加密→解密)
/*生成RSA密钥*/
$ openssl genrsa -des3 -passout pass:123456 -out RSA.pem
/*提取公钥*/
$ openssl rsa -in RSA.pem -passin pass:123456 -pubout -out pub.pem
/*使用RSA作为密钥进行加密,实际上使用其中的公钥进行加密*/
$ openssl rsautl -encrypt -in plain.txt -inkey RSA.pem -passin pass:123456 -out enc.txt
/*使用RSA作为密钥进行解密,实际上使用其中的私钥进行解密*/
$ openssl rsautl -decrypt -in enc.txt -inkey RSA.pem -passin pass:123456 -out replain.txt
/*比较原始文件和解密后文件*/
$ diff plain.txt replain.txt
/*使用公钥进行加密*/
$ openssl rsautl -encrypt -in plain.txt -inkey pub.pem -pubin -out enc1.txt
/*使用RSA作为密钥进行解密,实际上使用其中的私钥进行解密*/
$ openssl rsautl -decrypt -in enc1.txt -inkey RSA.pem -passin pass:123456 -out replain1.txt
/*比较原始文件和解密后文件*/
$ diff plain.txt replain1.txt
- 4.使用OpenSSL算法,测试Hash算法中的MD5(使用MD5加密“20165223cn”)
(三)实验结果
- 编译运行测试代码:test_openssl.c
(四)代码分析
- 实验代码:码云exp5 T1
任务二:通讯协议设计-2
(一)实验要求
1.在Ubuntu中实现对实验二中的“wc服务器”通过混合密码系统进行防护
2.提交测试截图
(二)实验步骤
$ gcc -o server server.c -I /usr/local/ssl/include -L/usr/local/ssl/lib -lssl -lcrypto -ldl -lpthread
$ gcc -o telent telent.c -I /usr/local/ssl/include -L/usr/local/ssl/lib -lssl -lcrypto -ldl -lpthread
- 3.产生私钥
$ openssl genrsa -out privkey.pem 1024
- 4.生成证书(需要填写信息)
$ openssl req -new -x509 -key privkey.pem -out CAcert.pem -days 1095
- 5.运行实现对实验二中的“wc服务器”通过混合密码系统进行防护
$ ./server 8888 1 CAcert.pem privkey.pem
$ ./telent 127.0.0.1 8888
(三)实验结果
- 实现对实验二中的“wc服务器”通过混合密码系统进行防护
(四)代码分析
- 实验代码:码云exp5 T2
二、实验总结
(一)遇到的问题
在编译测试代码的时候报错如下
- 原因:没有加上
-lssl
来链接OpenSSL的密码算法库 - 解决:在编译命令上加上
-lssl
即可
$ gcc -o to test_openssl.c -I /usr/local/ssl/include -L/usr/local/ssl/lib -lssl -lcrypto -ldl -lpthread
(二)分析与总结
(1)实验心得
- 这次的实验让我了解了OpenSSL的功能与基本使用方法,学会了通过OpenSSL来测试对称算法中的AES,非对称算法中的RSA,Hash算法中的MD5等,掌握了许多新的知识。
(2)OpenSSL知识点总结
OpenSSL 是一个安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。作为一个基于密码学的安全开发包,OpenSSL提供的功能相当强大和全面,囊括了主要的密码算法、常用的密钥和证书封装管理功能以及SSL协议,并提供了丰富的应用程序供测试或其它目的使用。
-
OpenSSL的基本功能
- 密码算法库
- SSL协议库
- 应用程序
-
OpenSSL实现对称加密
OpenSSL一共提供了8种对称加密算法,其中7种是分组加密算法,仅有的一种流加密算法是RC4。这7种分组加密算法分别是AES、DES、Blowfish、CAST、IDEA、RC2、RC5,都支持电子密码本模式(ECB)、加密分组链接模式(CBC)、加密反馈模式(CFB)和输出反馈模式(OFB)四种常用的分组密码加密模式。其中,AES使用的加密反馈模式(CFB)和输出反馈模式(OFB)分组长度是128位,其它算法使用的则是64位。事实上,DES算法里面不仅仅是常用的DES算法,还支持三个密钥和两个密钥3DES算法。 -
OpenSSL实现非对称加密
OpenSSL一共实现了4种非对称加密算法,包括DH算法、RSA算法、DSA算法和椭圆曲线算法(EC)。DH算法一般用于密钥交换。RSA算法既可以用于密钥交换,也可以用于数字签名,当然,如果你能够忍受其缓慢的速度,那么也可以用于数据加密。DSA算法则一般只用于数字签名。 -
OpenSSL的应用程序功能
OpenSSL的应用程序是基于OpenSSL的密码算法库和SSL协议库写成的,提供了相对全面的功能。OpenSSL的应用程序主要包括密钥生成、证书管理、格式转换、数据加密和签名、SSL测试以及其它辅助配置功能。