zoukankan      html  css  js  c++  java
  • 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个字节的数据
    ", buffer, len);
    else
        printf("消息接收失败!错误代码是%d,错误信息是‘%s‘
    ",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,将其安装且使用,详细运用到我们的加密方法中,学以致用,感觉收获很多。

  • 相关阅读:
    一只iPhone的全球之旅
    iOS开发之在地图上绘制出你运行的轨迹
    iOS开发之一些字符串常用的代码
    json格式化和查看工具
    iOS开发之结合asp.net webservice实现文件上传下载
    更改GROOVE的文件夹位置
    调试Windows Service
    从数据库中获取Insert语句
    iOS开发学习笔记(一)
    《影响力》的影响
  • 原文地址:https://www.cnblogs.com/JIUSHA/p/8051814.html
Copyright © 2011-2022 走看看