实验内容
- 基于Socket实现TCP通信,一人实现服务器,一人实现客户端
- 研究OpenSSL算法,测试对称算法中的AES,非对称算法中的RSA,Hash算法中的MD5
- 选用合适的算法,基于混合密码系统实现对TCP通信进行机密性、完整性保护。
实验知识点
- OpenSSL
- TCP通信
- 混合密码系统
实验步骤
(一)Linux下OpenSSL的安装与使用
- OpenSSL整个软件包大概可以分成三个主要的功能部分:
- 密码算法库
- SSL协议库
- 应用程序
- 安装过程
./configuremakesudo make install
- 测试AES
- 测试RSA
- 测试test_openssl.c
- 主要问题:按照教程一步步进行的时候,发现安装包中有config和Configure,一开始运行Configure,在make的时候总是会出现错误。全部重新来过运行config才正常。查找资料发现其实configure也是一种命令,但是在这次实验中要运行config才可以。
(二)TCP通信
- 一人实现服务器,一人实现客户端
- 服务器伪代码
socket()bind()listen()accept()closesocket()
- 客户端伪代码
socket()bind()connect()closesocket()
- 运行结果
(三)混合密码系统
在Ubuntu中实现对实验二中的“wc服务器”通过混合密码系统进行防护
生成证书
- 生成服务器端的私钥(key文件)
openssl genrsa -des3 -out server.key 1024
- 生成服务器端的csr文件
openssl req -new -key server.key -out server.csr -config
- 客户端生成key文件
openssl genrsa -des3 -out client.key 1024
- 生成客户端的csr文件
openssl req -new -key client.key -out client.csr -config
- 生成自己的CA,生成ca.key和ca.crt证书文件
openssl req -new -x509 -keyout ca.key -out ca.crt -config
- 用生成的ca给服务器的csr文件签名,生成服务器端的证书
Openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key -config openssl.cnf
- 用生成的ca给客户端的csr文件签名,生成客户端的证书
Openssl ca -in client.csr -out client.crt -cert ca.crt -keyfile ca.key -config openssl.cnf
- 主要问题:在生成服务器端的证书时,提示部门与CA中的定义的部门不符,重新进行第一步修改部门之后生成server.crt。在生成服务器端的证书时,提示因为与前面使用的common name相同,需要修改文件demoCA/index.txt.attr, 将里面的:
unique_subject = yes
改为unique_subject = no
保存退出再重新输入就可以了。
用混合密码系统进行防护
- 基本框架与socket编程一样,只是其中需要加入头文件:
#include#include #include
和一些其他的代码:
SSL_library_init();OpenSSL_add_all_algorithms();SSL_load_error_strings();ctx = SSL_CTX_new(SSLv23_server_method());if (ctx == NULL) { ERR_print_errors_fp(stdout); exit(1); }if (SSL_CTX_use_certificate_file(ctx, argv[3], SSL_FILETYPE_PEM) <= 0) { ERR_print_errors_fp(stdout); exit(1); }if (SSL_CTX_use_PrivateKey_file(ctx, argv[4], SSL_FILETYPE_PEM) <= 0) { ERR_print_errors_fp(stdout); exit(1); }if (!SSL_CTX_check_private_key(ctx)) { ERR_print_errors_fp(stdout); exit(1); }
- 运行结果
参考资料
PSP时间统计
步骤 | 耗时 | 百分比 |
---|---|---|
需求分析 | 10min | 10% |
设计 | 20min | 20% |
代码实现 | 50min | 50% |
测试 | 10min | 10% |
总结分析 | 10min | 10% |