1. 程式人生 > >2018-2019-1 20165202 實驗五 通訊協議設計

2018-2019-1 20165202 實驗五 通訊協議設計

2018-2019-1 20165202 實驗五 通訊協議設計

一、實驗內容

  • 1.安裝OpenSSL環境,並編寫測試程式碼驗證無誤
  • 2.研究OpenSSL演算法,測試對稱演算法中的AES,非對稱演算法中的RSA,Hash演算法中的MD5
  • 3.在Ubuntu中實現對實驗二中的“wc伺服器”通過混合密碼系統進行防護

二、實驗步驟

  1. 根據老師給的OpenSSL下載路徑下載壓縮包並解壓縮,然後進入解壓縮檔案的一級目錄的終端。
  • 在命令列中輸入
    ./config make sudo make install

  • 等待安裝完即可。其中需要注意的一行是庫檔案被複制到哪個資料夾裡面了

    • 編寫一個測試程式碼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/lib(路徑) -lcrypto -ldl -lpthread
    > ./test_openssl
    > echo $?

實驗截圖:

  1. 研究OpenSSL演算法,測試對稱演算法中的AES,非對稱演算法中的RSA,Hash演算法中的MD5
    • 對稱加密:對稱加密需要使用的標準命令為 enc
    openssl enc -ciphername [-in filename] [-out filename] [-pass arg] [-e] [-d] [-a/-base64]
       [-A] [-k password] [-kfile filename] [-K key] [-iv IV] [-S salt] [-salt] [-nosalt] [-z] [-md]
       [-p] [-P] [-bufsize number] [-nopad] [-debug] [-none] [-engine id]
    
    -in filename:指定要加密的檔案存放路徑
    
    -out filename:指定加密後的檔案存放路徑
    
    -salt:自動插入一個隨機數作為檔案內容加密,預設選項
    
    -e:可以指明一種加密演算法,若不指的話將使用預設加密演算法
    
    -d:解密,解密時也可以指定演算法,若不指定則使用預設演算法,但一定要與加密時的演算法一致
    
    -a/-base64:使用-base64位編碼格式
  • AES:

    openssl enc -aes-128-cbc -in plain.txt -out out.txt -pass pass:123456   //密碼123456
  • RSA:

    RSA 的用法如下:
    
    openssl rsa [-inform PEM|NET|DER] [-outform PEM|NET|DER] [-in filename] [-passin arg] [-out filename] [-passout arg]
       [-sgckey] [-des] [-des3] [-idea] [-text] [-noout] [-modulus] [-check] [-pubin] [-pubout] [-engine id]
    常用選項:
    
    -in filename:指明私鑰檔案
    
    -out filename:指明將提取出的公鑰儲存至指定檔案中 
    
    -pubout:根據私鑰提取出公鑰 
  • MD5:

    openssl passwd -1 -in test.txt -salt 12345678    
    
    生成密碼需要使用的標準命令為 passwd ,用法如下:
    
    openssl passwd [-crypt] [-1] [-apr1] [-salt string] [-in file] [-stdin] [-noverify] [-quiet] [-table] {password}
    常用選項有:
    
    -1:使用md5加密演算法
    
    -salt string:加入隨機數,最多8位隨機數
    
    -in file:對輸入的檔案內容進行加密
    
    -stdion:對標準輸入的內容進行加密
    

實驗截圖:

  1. 在Ubuntu中實現對實驗二中的“wc伺服器”通過混合密碼系統進行防護
  • 標頭檔案:
#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);

實驗截圖:

三、實驗過程中遇到的問題和解決方案

  • 問題1:
  • 在第一步下載完老師給的OpenSSL連結中的壓縮包以後,解壓縮以後make不通過,發現有.c檔案出現錯誤。

  • 問題1解決方案:
  • 和其他同學交流以後我得到了解決方案,可能是老師指定下載的版本與當前ubuntu的版本不適應而造成的錯誤。之後我選擇了下載OpenSSL官網上的Master壓縮包,下載完畢解壓縮以後再make就可以通過了。

四、實驗體會與總結

本次實驗是資訊安全系統設計技術的最後一次實驗,十分不捨,感謝婁老師一個學期以來的培養。