20155308&20155316 2017-2018-1 《信息安全系统设计基础》实验五
通讯协议设计-1
实验内容
在Ubuntu中完成 http://www.cnblogs.com/rocedu/p/5087623.html 中的作业
OpenSSL
- 简介
OpenSSL是一个SSL协议的开源实现,采用C语言作为开发语言,具备了跨平台的能力,支持Unix/Linux、Windows、Mac OS等多种平台。
- 功能部分
OpenSSL整个软件包大概可以分成三个主要的功能部分:
- 密码算法库
- SSL协议库
- 应用程序
OpenSSL源码的目录结构也是围绕这三个功能部分进行规划的。
- 作用
数据加密是信息信息传输中的一个重要组成部分。任何信息都以明文方式传输,确实是个很不安全的做法。所以,需要对数据进行加密。将明文数据转换为密文数据,再进行传输。
OpenSSL是一套用于SSL/TLS协议的加密工具,其作用有:
1. 生成私有密钥.
2. 生成证书,即数字签名证书,它包含一个公有密钥,可以用来单向的加密和解密数据。即,使用公钥加密的数据,只能使用私有密钥解密。使用私钥加密的数据,可以使用公钥来解密。
3. 计算信息摘要.。
4. SSL/TLS客户端和服务器端测试。
5. 处理S/MIME标记和邮件的加密。
密码算法库是一个强大完整的密码算法库,它是OpenSSL的基础部分,也是很值得一般密码安全技术人员研究的部分,它实现了目前大部分主流的密码算法和标准。主要包括对称算法、非对称算法、散列算法、数字签名和认证、X509数字证书标准、PKCS12、PKCS7等标准。其他两个功能部分SSL协议和应用程序都是基于这个库开发的。
应用程序是基于密码算法库和SSL协议库实现的命令,熟悉OpenSSL可以从使用这些应用程序开始。应用程序覆盖了密码技术的应用,主要包括了各种算法的加密程序和各种类型密钥的产生程序(如RSA、Md5、Enc等等)、证书签发和验证程序(如Ca、X509、Crl等)、SSL连接测试程序(如S_client和S_server等)以及其它的标准应用程序(如Pkcs12和Smime等)。
安装过程
- openssl的安装
安装步骤:
1.下载openssl(我选的为最新版本的)
2.解压
tar xzvf openssl-1.2.0n.tar.gz
3.配置
cd openssl-1.2.0n
./config
make
4.安装
sudo make install
5.测试
make test
Linux下OpenSSL的使用
通过man openssl
查看帮助文档。
编写一个测试代码test_openssl.c进行测试:
#include <stdio.h>
#include <openssl/evp.h>
int main(){
OpenSSL_add_all_algorithms();
return 0;
}
然后用下面命令编译:
gcc -o to test_openssl.c -I /usr/local/ssl/inlcude /usr/local/ssl/lib -ldl -lpthread
执行
./to;echo $?
截图为:
实验中的问题
- 问题
因为我下载的为openssl-1.2.0n.tar.gz,所以按照老师的步骤进行安装的时候要注意几点:
- 解压时改为命令
tar xzvf openssl-1.2.0n.tar.gz
而不是
tar xzvf openssl-1.1.0-pre1.tar.gz
- 在配置时应输入命令
./config
而不是./ifconfig
,因为在运行./ifconfig
时发现系统提示“无法找到文件”,而我去查看文档的时候,发现文件config和老师所建议的openssl-1.1.0-pre1.tar.gz 文件中的ifconfig是相同的。
3.试着用
gcc -o to test_openssl.c -I /usr/local/ssl/inlcude /usr/local/ssl/lib -ldl -lpthread
编译,发现编译失败,手动切入/usr/local/ssl/lib目录下查看,发现有两个.a库,试着将命令改成
gcc -o to test_openssl.c -I /usr/local/ssl/inlcude /usr/local/ssl/libcrypto.a /usr/local/ssl/libssl.a -ldl -lpthread
编译成功!
作业
基于Socket的TCP通信
测试OpenSSL算法
- 研究OpenSSL算法,测试对称算法中的AES,非对称算法中的RSA,Hash算法中的MD5
采用AES算法
AES:
openssl enc -aes-128-cbc -in plain.txt -out out.txt -pass pass:123456 //密码123456
- AES代码
- 截图
采用RSA算法
私有密钥生成方法
openssl genrsa -out rsakey0.pem 1024
采用RSA算法,并使用密码保护。在生成私钥时,需要输入一个密码,用于保护私钥。
在使用这个私钥进行加/解密操作时,也需要输入这个密码。
openssl genrsa -des3 -out rsakey1.pem 1024
公用密钥的生成方法
根据私钥来生成公钥
生成rsa算法的公钥
openssl rsa -in rsakey0.pem -pubout -out rsakey0-pub.pem
自签名证书的生成方法
产生RSA算法的证书
openssl req -x509 -key rsakey0.pem -days 365 -out mycert-rsa.pem -new
- RSA代码
- 截图
采用MD5算法
openssl passwd -1 -in test.txt -salt 12345678
生成密码需要使用的标准命令为 passwd ,用法如下:
openssl passwd [-crypt] [-1] [-apr1] [-salt string] [-in file] [-stdin] [-noverify] [-quiet] [-table] {password}
- MD5代码
- 截图
通讯协议设计-2
实验内容
- 在Ubuntu中实现对实验二中的“wc服务器”通过混合密码系统进行防护
过程
- 实现过程机制
- 见http://www.cnblogs.com/Vivian517/p/8000784.html博客学习
- 头文件:
#include <openssl/ssl.h>
#include <openssl/err.h>
SSL库初始化
SSL_library_init();
载入所有 SSL 算法
OpenSSL_add_all_algorithms();
载入所有 SSL 错误消息
SSL_load_error_strings();
产生一个 SSL_CTX
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);
}
基于 ctx 产生一个新的 SSL,并将连接用户的 socket 加入到 SSL
ssl = SSL_new(ctx);
SSL_set_fd(ssl, new_server_socket_fd);
建立 SSL 连接
if (SSL_accept(ssl) == -1) {
perror("accept");
close(new_fd);
break;
}
SSL数据传输
int len = SSL_read(ssl, buffer, MAXBUF);
if (len > 0)
printf("接收消息成功:‘%s‘,共%d个字节的数据\n", buffer, len);
else
printf("消息接收失败!错误代码是%d,错误信息是‘%s‘\n",errno, strerror(errno));
客户端与服务器传输完数据后,关闭 SSL 连接,释放 SSL
SSL_shutdown(ssl);
SSL_free(ssl);
释放 CTX
SSL_CTX_free(ctx);
- 编译方式:
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
- 生产私钥和证书
openssl genrsa -out privkey.pem 1024
openssl req -new -x509 -key privkey.pem -out CAcert.pem -days 1095
- 程序运行方式:
./server 7838 1 CAcert.pem privkey.pem
./telent 127.0.0.1 7838
- 实现编译命令如下:
通讯协议设计-3
因为没有办法ping通,所以不能完成
实验感想
本次实验通过学习openssl,将其安装且使用,详细运用到我们的加密方法中,学以致用,感觉收获很多。