zoukankan      html  css  js  c++  java
  • 2017-2018-1 20155338 信息安全系统设计基础》实验五 通信协议设计

    2017-2018-1 20155338 信息安全系统设计基础》实验五 通信协议设计

    实验要求:

    任务一:Linux下OpenSSL的安装与使用

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

    两人一组

    1、基于Socket实现TCP通信,一人实现服务器,一人实现客户端
    
    2、研究OpenSSL算法,测试对称算法中的AES,非对称算法中的RSA,Hash算法中的MD5
    
    3、选用合适的算法,基于混合密码系统实现对TCP通信进行机密性、完整性保护。
    
    4、学有余力者,对系统进行安全性分析和改进。
    
    

    1、完成过程:

    1、通过老师提供的链接进行下载Linux下OpenSSL的安装与使用,并安装

    2、安装成功后用命令行解压

    3、解压源代码:tar xzvf openssl-1.1.0-pre1.tar.gz

    4、进入源代码目录:cd openssl-1.1.0-pre1

    5、使用下列命令编译安装:

    ./config
    make
    make test
    make install
    
    

    6、完成上述步骤,openssl-1.1.0就安装好了。

    • 编写一个测试代码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

    echo $?

    “-L”之后指定的是链接库的路径,由于要导入OpenSSL所以使用-lcrypto参数

    运行结果如下:

    return 0了则说明安装成功。

    2、基于Socket实现TCP通信

    socket的基本操作:

    socket()函数、bind()函数、listen()、connect()函数、accept()函数、read()、write()函数等。

    • bind()函数把一个地址族中的特定地址赋给socket。例如对应AF_INET、AF_INET6就是把一个ipv4或ipv6地址和端口号组合赋给socket。

    • TCP服务器端依次调用socket()、bind()、listen()之后,就会监听指定的socket地址了。

    运行截图如下:

    3、通过openssl测试密码算法(上传到蓝墨云上的作业中图片可能不是很清晰,但放的也是原图,不知是什么原因,这里放上清晰的)

    这里我选择了非对称密码算法的RSA,Hash算法中的MD5。

    测试RSA

    • 创建一个文本文件,里面输入123456:openssl enc -aes-128-cbc -in plain.txt -out out.txt -pass file:passwd.txt

    • 生成rsa私钥文件:openssl genrsa -out rsaprivatekey.pem 1024

    • 生成公钥文件,指明输出文件是公钥文件:openssl rsa -in rsa_private_key.pem -pubou -out rsa_private_key.pem

    • 用公钥匙rsa_private_key.pem加密文件readme.txt,输出到文件hello.en:openssl rsautl -encrypt -in readme.txt -inkey rsa_private_key.pem -pubin -out hello.en

    • 使用私钥匙rsa_private_key.pem解密密文hello.en输出到文件hello.de: openssl rsautl -decrypt -in hello.en -inkey rsa_private_key.pem -pubin -out hello. de

    结果如下:

    测试md5

    echo "plain.txt" | openssl dgst -md5

    结果如下:

    任务二:

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

    • 提交测试截图

    基于OpenSSL的程序都要遵循以下几个步骤:

    (1)、OpenSSL初始化:

    在使用OpenSSL之前,必须进行相应的协议初始化工作,可以通过下面的函数实现:

    int SSL_library_int(void);

    (2)选择会话协议:

    在利用OpenSSL开始SSL会话之前,需要为客户端和服务器制定本次会话采用的协议,目前能够使用的协议包括TLSv1.0、SSLv2、SSLv3、SSLv2/v3。
    需要注意的是,客户端和服务器必须使用相互兼容的协议,否则SSL会话将无法正常进行。

    (3)创建会话环境:

    在OpenSSL中创建的SSL会话环境称为CTX,使用不同的协议会话,其环境也不一样的。

    • 申请SSL会话环境的OpenSSL函数是:

      SSL_CTX *SSL_CTX_new(SSL_METHOD * method);

      当SSL会话环境申请成功后,还要根据实际的需要设置CTX的属性,通常的设置是指定SSL握手阶段证书的验证方式和加载自己的证书。

    • 制定证书验证方式的函数是:

       int SSL_CTX_set_verify(SSL_CTX *ctx,int mode,int(*verify_callback),int(X509_STORE_CTX *));
       
    
    • 为SSL会话环境加载CA证书的函数是:
       SSL_CTX_load_verify_location(SSL_CTX *ctx,const char *Cafile,const char *Capath);
       
    
    • 为SSL会话加载用户证书的函数是:
    
       SSL_CTX_use_certificate_file(SSL_CTX *ctx, const char *file,int type);
       
    
    • 为SSL会话加载用户私钥的函数是:
    
       SSL_CTX_use_PrivateKey_file(SSL_CTX *ctx,const char* file,int type);
       
    
    • 在将证书和私钥加载到SSL会话环境之后,就可以调用下面的函数来验证私钥和证书是否相符:
    
       int SSL_CTX_check_private_key(SSL_CTX *ctx);
    
    

    (4)建立SSL套接字

    SSL套接字是建立在普通的TCP套接字基础之上,在建立SSL套接字时可以使用下面的一些函数:

    
    SSL *SSl_new(SSL_CTX *ctx);//申请一个SSL套接字
    
    int SSL_set_fd(SSL *ssl,int fd);)//绑定读写套接字
    
    int SSL_set_rfd(SSL *ssl,int fd);//绑定只读套接字
    
    int SSL_set_wfd(SSL *ssl,int fd);//绑定只写套接字
    
    

    (5)完成SSL握手

    在成功创建SSL套接字后,客户端应使用函数SSL_connect( )替代传统的函数connect( )来完成握手过程:

    
     int SSL_connect(SSL *ssl);
     
    

    而对服务器来讲,则应使用函数SSL_ accept ( )替代传统的函数accept ( )来完成握手过程:

    
    int SSL_accept(SSL *ssl);
    
    

    握手过程完成之后,通常需要询问通信双方的证书信息,以便进行相应的验证,这可以借助于下面的函数来实现:

    
    X509 *SSL_get_peer_certificate(SSL *ssl);
    
    

    该函数可以从SSL套接字中提取对方的证书信息,这些信息已经被SSL验证过了。

    
    X509_NAME *X509_get_subject_name(X509 *a);
    
    

    该函数得到证书所用者的名字。

    (6)进行数据传输

    当SSL握手完成之后,就可以进行安全的数据传输了,在数据传输阶段,需要使用SSL_read( )和SSL_write( )来替代传统的read( )和write( )函数,来完成对套接字的读写操作:

    
    int SSL_read(SSL *ssl,void *buf,int num);
    int SSL_write(SSL *ssl,const void *buf,int num);
    
    

    (7)结束SSL通信

    当客户端和服务器之间的数据通信完成之后,调用下面的函数来释放已经申请的SSL资源:

    
    int SSL_shutdown(SSL *ssl);
    void SSl_free(SSL *ssl);
    void SSL_CTX_free(SSL_CTX *ctx);
    
    

    运行截图:

    参考资料:

    openssl证书生产过程

    Linux 中的 Openssl命令及实例代码

    OpenSSL程序编写步骤

  • 相关阅读:
    links[v1]
    WebSocket handshake: Unexpected response code: 404
    Spring mvc 启动 和 请求分发
    匹配括号
    js parseFloat 精度问题
    遍历查找跳格子逻辑
    Generic type test java
    java高效判断素数
    从数组中取3个数全排列
    vue-cli
  • 原文地址:https://www.cnblogs.com/Hdywan/p/8053272.html
Copyright © 2011-2022 走看看