# 2017-2018-1 20155324 实验五 通信协议设计 2017-2018-1 20155324 实验五 通信协议设计

任务一

实验步骤

安装OpenSSL

OpenSSL是一个SSL协议的开源实现,采用C语言作为开发语言,具备了跨平台的能力,支持Unix/Linux、Windows、Mac OS等多种平台。

  • 前往OpenSSL官网,下载OpenSSL源码,下载压缩包“openssl-master.zip

  • 在Linux下使用~unzip openssl-master.zip~命令解压

  • 进入源代码目录~cd openssl-1.1.0-pre1~

  • 使用如下命令进行安装:

$ ./config
$ make
$ make test
$ make install
  • 编写一个测试代码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命令编译,生成“test_openssl”可执行文件,运行程序,并执行echo $?~,结果打印0,测试结果表明安装成功。

# 2017-2018-1 20155324 实验五 通信协议设计
2017-2018-1 20155324 实验五 通信协议设计

作业
  1. 两人一组

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

  3. 研究OpenSSL算法,测试对称算法中的AES,非对称算法中的RSA,Hash算法中的MD5

  4. 选用合适的算法,基于混合密码系统实现对TCP通信进行机密性、完整性保护。

  5. 学有余力者,对系统进行安全性分析和改进。

研究OpenSSL算法,测试对称算法中的AES,非对称算法中的RSA,Hash算法中的MD5

函数

socket():建立一个socket连接,可指定socket类型等信息。在建立socket连接之后,可对sockaddr或sockaddr_in结构进行初始化,以保存所建立的socket地址信息。

bind():将本地IP地址绑定到端口号,若绑定其他IP地址则不能成功

listen():在服务端程序成功建立套接字和与地址进行绑定之后,用listen()函数来创建一个等待队列,在其中存放未处理的客户端连接请求

connect():在TCP中是用于bind()的之后的客户端,用于与服务器端建立连接

accept():创建等待队列之后,调用此函数等待并接收客户端的连接请求

read()/write()

send()/recv()

close():完成了写操作后关闭相应的socket描述字

使用对称加密指令作为enc指令的参数调用对称加密指令

  • AES算法

测试命令:openssl enc -aes-128-cbc -in plain.txt -out encrypt.txt -pass pass:123456 -p

  • 利用RSA对hello文件进行加密
/*生成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


  • 测试MD5算法

使用~echo "20155324" | openssl dgst -md5~ 用MD5算法加密信息"20155324"

# 2017-2018-1 20155324 实验五 通信协议设计
2017-2018-1 20155324 实验五 通信协议设计

混合密码系统

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

OpenSSL函数

头文件:

#include <openssl/ssl.h>
#include <openssl/err.h>
  • OpenSSL初始化:int SSL_library_int(void);
  • 选择会话协议:目前能够使用的协议包括TLSv1.0、SSLv2、SSLv3、SSLv2/v3,客户端和服务器必须使用相互兼容的协议
  • 创建会话环境:(CTX)使用不同的协议会话,其环境也不一样的。
实验步骤
  • 编译server.c
gcc -o server server.c -I /usr/local/ssl/include -L/usr/local/ssl/lib -lssl -lcrypto -ldl -lpthread

  • 编译telent.c
gcc -o telent telent.c -I /usr/local/ssl/include -L/usr/local/ssl/lib -lssl -lcrypto -ldl -lpthread

  • 生产私钥和证书
openssl genrsa -out privkey.pem 1024
openssl req -new -x509 -key privkey.pem -out CAcert.pem -days 1095
  • 运行
./server 5227 1 CAcert.pem privkey.pem
./telent 127.0.0.1 5227

# 2017-2018-1 20155324 实验五 通信协议设计
2017-2018-1 20155324 实验五 通信协议设计

新学到的知识点

OpenSSL

OpenSSL 是一个安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。

数据保密性

信息加密就是把明码的输入文件用加密算法转换成加密的文件以实现数据的保密。加密
的过程需要用到密钥来加密数据然后再解密。没有了密钥,就无法解开加密的数据。数据加密之后,只有密钥要用一个安全的方法传送。加密过的数据可以公开地传送。

数据完整性

加密也能保证数据的一致性。例如:消息验证码(MAC),能够校验用户提供的加密信息,接收者可以用MAC来校验加密数据,保证数据在传输过程中没有被篡改过。

安全验证

加密的另外一个用途是用来作为个人的标识,用户的密钥可以作为他的安全验证的标识。SSL是利用公开密钥加密技术RSA)来作为用户端与服务器端在传送机密资料时的加密通讯协定。

OpenSSL包含一个命令行工具用来完成OpenSSL库中的所有功能,更好的是,它可能已经安装到你的系统中了。

OpenSSL是一个强大的安全套接字层密码库,Apache使用它加密HTTPS,OpenSSH使用它加密SSH,但是,你不应该只将其作为一个库来使用,它还是一个多用途的、跨平台的密码工具。

基本功能

  1. SSL协议库
  2. 应用程序
  3. 密码算法库

作为一个基于密码学的安全开发包,OpenSSL提供的功能相当强大和全面,囊括了主要的密码算法、常用的密钥和证书封装管理功能以及SSL协议,并提供了丰富的应用程序供测试或其它目的使用。

对称加密

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一共实现了4种非对称加密算法,包括DH算法、RSA算法、DSA算法和椭圆曲线算法(EC)。DH算法一般用于密钥交换。RSA算法既可以用于密钥交换,也可以用于数字签名,当然,如果你能够忍受其缓慢的速度,那么也可以用于数据加密。DSA算法则一般只用于数字签名。

功能

OpenSSL的应用程序已经成为了OpenSSL重要的一个组成部分,其重要性恐怕是OpenSSL的开发者开始没有想到的。如OpenCA,就是完全使用OpenSSL的应用程序实现的。OpenSSL的应用程序是基于OpenSSL的密码算法库和SSL协议库写成的,所以也是一些非常好的OpenSSL的API使用范例,读懂所有这些范例,你对OpenSSL的API使用了解就比较全面了,当然,这也是一项锻炼你的意志力的工作。

OpenSSL的应用程序提供了相对全面的功能,在相当多的人看来,OpenSSL已经为自己做好了一切,不需要再做更多的开发工作了,所以,他们也把这些应用程序称为OpenSSL的指令。OpenSSL的应用程序主要包括密钥生成、证书管理、格式转换、数据加密和签名、SSL测试以及其它辅助配置功能。

实验中遇到的问题

问题一:openssl-1.0.1k>nmake -f ms tdll.mak这一步时候出现

# 2017-2018-1 20155324 实验五 通信协议设计
2017-2018-1 20155324 实验五 通信协议设计

解决方法:打开C:openssl-1.0.1k(openssl的安装目录)cryptocversion.c
在80行 return(cflags); 改成 return(CFLAGS); (改为大写)

问题二:继续openssl-1.0.1k>nmake -f ms tdll.mak提示
'ml' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

解决方法:
下载masm并把其中的ml.exe拷贝至C:Program Files (x86)Microsoft Visual StudioVC98Bin下即可。

参考资料