2019-2020-1 《信息安全系统设计基础》 实验五 通讯协议设计
一、实验内容
1、通讯协议设计-1
在Ubuntu中完成 http://www.cnblogs.com/rocedu/p/5087623.html 中的作业
提交运行结果截图
2、通讯协议设计-2
在Ubuntu中实现对实验二中的“wc服务器”通过混合密码系统进行防护
提交测试截图
二、实验步骤
1、通讯协议设计-1
了解OpenSSL
OpenSSL是一个SSL协议的开源实现,采用C语言作为开发语言,具备了跨平台的能力,支持Unix/Linux、Windows、Mac OS等多种平台。
OpenSSL最早的版本在1995年发布,1998年后开始由OpenSSL项目组维护和开发。当前最新的版本是1.1.0 alpha版本,完全实现了对SSLv1、SSLv2、SSLv3和TLS的支持。。目前,OpenSSL已经得到了广泛的应用,许多类型的软件中的安全部分都使用了OpenSSL的库,如VOIP的OpenH323协议、Apache服务器、Linux安全模块等等。
OpenSSL整个软件包大概可以分成三个主要的功能部分:
- 密码算法库
- SSL协议库
- 应用程序
了解更多可以参考:OpenSSL简介
在Linux下OpenSSL的安装
从 OpenSSL源码下载地址 这里下载源码,下载它的压缩包,将其通过共享文件夹移到虚拟机里。
在虚拟机压缩包文件夹下的终端里使用以下命令:
-
解压源码:unzip openssl-master.zip
-
进入源代码目录:cd openssl-master
-
编译安装:./config
-
make
-
sudo make install
-
使用make test进行测试
编写测试代码test_openssl.c
#include <stdio.h>
#include <openssl/evp.h>
int main(){
OpenSSL_add_all_algorithms();
return 0;
}
进行编译:gcc -o test_openssl test_openssl.c -L/usr/local/ssl/lib -lcrypto -ldl -lpthread
实现 echo $?
进行执行,结果打印了一个 0
作业
- 两人一组
- 基于 Socket 实现 TCP 通信,一人实现服务器,一人实现客户端
- 研究 OpenSSL 算法,测试对称算法中的 AES ,非对称算法中的 RSA , Hash 算法中的 MD5
- 选用合适的算法,基于混合密码系统实现对 TCP 通信进行机密性、完整性保护。
- 学有余力者,对系统进行安全性分析和改进。
完成
-
基于 Socket 实现 TCP 通信,一人实现服务器,一人实现客户端
-
编写代码
-
研究OpenSSL算法,测试对称算法中的AES,非对称算法中的RSA,Hash算法中的MD5
AES
- 码云链接:AES
- 使用 gcc AES.c -o AES -lssl -lcrypto 进行编译
- 运行截图
RSA
- 码云链接:RSA
- 使用openssl工具
- 生成一个密钥:openssl genrsa -out test.key 1024 (-out接生成的文件名)
- 提取出公钥:openssl rsa -in test.key -pubout -out test_pub.key (-in接输入文件,-out接生成公钥的文件名)
- 在目录中创建一个hello的文本文件
- 利用生成的公钥加密文件:openssl rsautl -encrypt -in hello -inkey test_pub.key -pubin -out hello.en (-in接要加密的文件,-inkey接密钥,-pubin表明是用纯公钥文件加密,-out接加密后的文件)
- 解密文件:openssl rsautl -decrypt -in hello.en -inkey test.key -out hello.de (-in接被加密的文件,-inkey接私钥文件,-out接解密后的文件
MD5
- 码云链接:MD5
- 运行截图:
2、通讯协议设计-2
了解混合密码系统
混合密码系统:将对称密码和公钥密码的优势相结合的方法。一般情况下,将两种不同的方式相结合的做法就称为混合。
将消息通过对称密码来加密,将加密消息时使用的密钥通过公钥密码来加密,这样的两步密码机制就是混合密码系统的本质。
了解更多可以参考混合密码系统
关于混合密码系统的加密,参考混合密码系统的加密
1. 对于linux下的OPENSSL编程
- 头文件:
#include <openssl/ssl.h>
#include <openssl/err.h>
- 基于OpenSSL的程序都要遵循以下几个步骤:
- OpenSSL初始化
在使用OpenSSL之前,必须进行相应的协议初始化工作,这可以通过下面的函数实现:
int SSL_library_int(void)
-
选择会话协议
- 目前能够使用的协议包括TLSv1.0、SSLv2、SSLv3、SSLv2/v3
-
创建会话环境
申请SSL会话环境的OpenSSL函数是:
SSL_CTX *SSL_CTX_new(SSL_METHOD * method);
- 建立SSL套接字
申请一个SSL套接字:
SSL *SSl_new(SSL_CTX *ctx);
- 完成SSL握手
- 进行数据传输
- 结束SSL通信
详细过程参考:
linux下的OPENSSL编程- 简单函数介绍
生成私钥和证书:
openssl genrsa -out privkey.pem 1024
openssl req -new -x509 -key privkey.pem -out CAcert.pem -days 1095
编译
gcc server_wc.c -o server_wc.out -lssl -lcrypto
gcc client_wc.c -o client_wc.out -lssl -lcrypto
三、实验中遇到的问题及解决方法
问题1:
- 运行AES时出现错误
问题1解决方法:
- 输入命令sudo ln -s /usr/local/lib/libssl.so.3 /usr/lib/libssl.so.3和sudo ln -s /usr/local/lib/libcrypto.so.3 /usr/lib/libcrypto.so.3