2018-2019-1 20165202 實驗五 通訊協議設計
阿新 • • 發佈:2018-12-16
2018-2019-1 20165202 實驗五 通訊協議設計
一、實驗內容
- 1.安裝OpenSSL環境,並編寫測試程式碼驗證無誤
- 2.研究OpenSSL演算法,測試對稱演算法中的AES,非對稱演算法中的RSA,Hash演算法中的MD5
- 3.在Ubuntu中實現對實驗二中的“wc伺服器”通過混合密碼系統進行防護
二、實驗步驟
- 根據老師給的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 $?
實驗截圖:
- 研究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:對標準輸入的內容進行加密
實驗截圖:
- 在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就可以通過了。
四、實驗體會與總結
本次實驗是資訊安全系統設計技術的最後一次實驗,十分不捨,感謝婁老師一個學期以來的培養。