20155308 2017-2018-1 《信息安全系统设计基础》实验五

20155308&20155316 2017-2018-1 《信息安全系统设计基础》实验五

通讯协议设计-1

实验内容

在Ubuntu中完成 http://www.cnblogs.com/rocedu/p/5087623.html 中的作业

OpenSSL

  1. 简介

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

  1. 功能部分

OpenSSL整个软件包大概可以分成三个主要的功能部分:

  • 密码算法库
  • SSL协议库
  • 应用程序

OpenSSL源码的目录结构也是围绕这三个功能部分进行规划的。

  1. 作用

数据加密是信息信息传输中的一个重要组成部分。任何信息都以明文方式传输,确实是个很不安全的做法。所以,需要对数据进行加密。将明文数据转换为密文数据,再进行传输。
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,所以按照老师的步骤进行安装的时候要注意几点:

  1. 解压时改为命令

tar xzvf openssl-1.2.0n.tar.gz

而不是

tar xzvf openssl-1.1.0-pre1.tar.gz
2. 在配置时应输入命令 ./config而不是 ./configure,因为在运行./configure时发现系统提示“无法找到文件”,而我去查看文档的时候,发现文件config和老师所建议的openssl-1.1.0-pre1.tar.gz 文件中的configure是相同的。


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

采用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

采用MD5算法

openssl passwd -1 -in test.txt -salt 12345678

生成密码需要使用的标准命令为 passwd ,用法如下:

openssl passwd [-crypt] [-1] [-apr1] [-salt string] [-in file] [-stdin] [-noverify] [-quiet] [-table] {password}

  • 截图

通讯协议设计-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);
  • 编译方式:

server.c代码

telent.c代码

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
  • 生产私钥和证书

privkey.pem代码

openssl genrsa -out privkey.pem 1024
openssl req -new -x509 -key privkey.pem -out CAcert.pem -days 1095
  • 程序运行方式:

CAcert.pem代码

./server 7838 1 CAcert.pem privkey.pem
./telent 127.0.0.1 7838
  • 实现编译命令如下:

通讯协议设计-3

因为没有办法ping通,所以不能完成

实验感想

本次实验通过学习openssl,将其安装且使用,详细运用到我们的加密方法中,学以致用,感觉收获很多。

posted @ 2017-12-17 13:01  郝文菲20155308  阅读(254)  评论(0编辑  收藏  举报