2017-2018-1 20155222 201552228 实验五 通讯协议设计
2017-2018-1 20155222 201552228 實驗五 通訊協議設計
實驗內容和要求
通訊協議設計-1
在Ubuntu中完成 http://www.cnblogs.com/rocedu/p/5087623.html 中的作業
提交運行結果截圖
通訊協議設計-2
在Ubuntu中實現對實驗二中的“wc服務器”通過混合密碼系統進行防護
提交測試截圖
運行實驗箱中,ARM調用Z32算法的實驗,提交實驗截圖
用Z32的國密算法重新改寫“wc服務器”的混合密碼系統防護,提交運行截圖
實驗步驟
SSL/TLS協議概述
1994年Netscape開發了SSL(Secure Socket Layer,安全套接層協議),專門用于保護Web通訊。
它采用公鑰技術,其目標是保證兩個應用間通信的保密性和可靠性,可在服務器和客戶機兩端同時實現支持。
現行Web瀏覽器普遍將HTTP和SSL相結合,從而實現安全通信。
SSL協議的使用
SSL是獨立于各種協議的,常用于HTTP協議,但也可用于別的協議,如SMTP、TELNET等
協議的目標:SSL/TLS被設計用來使用TCP提供一個可靠的端到端安全服務,為兩個通訊個體之間提供保密性和完整性(身份鑒別)。
SSL/TLS提供3種標準服務:信息保密、信息完整性和雙向認證
SSL的體系結構
協議分為兩層
底層:SSL記錄協議,為上層協議提供基本的安全業務。
上層:SSL握手協議、SSL修改密碼說明協議、SSL警告協議,用于SSL交換過程的管理。
Linux下OpenSSL的安裝
Linux下的應用大多可以直接使用,也可以獲取源代碼自己進行編譯、安裝,使用源代碼安裝的過程一般是:
configure make make installOpenSSL的安裝也是這樣。首先解壓源代碼:
tar xzvf openssl-1.1.0-pre1.tar.gz
然后進入源代碼目錄:
cd openssl-1.1.0-pre1
然后使用下列命令編譯安裝:
其實OpenSSL的安裝并不是這樣的,輸入./configue會報錯說找不到這個命令
安裝流程
- 直接百度openssl找到官網進去,找到下載鏈接鏈接到Github下載.zip文件
- 在文件下載目錄里輸入命令解壓.zip文件
解壓完成后使用cd ./oenpssl-master命令進入解壓文件的目錄中再使用ls命令會看到這個文件里有一個ReadMe
使用'./ReadMe'打開文檔,里面有詳細的安裝教程
INSTALLATION ON THE UNIX PLATFORM
Quick Start快速開始
-----------
If you want to just get on with it, do:如果你只是想快速上手做好使用準備,請執行以下操作:
$ ./config
$ make
$ make test
$ make install
[If any of these steps fails, see section Installation in Detail below.][如果這些步驟中的任何一個失敗,請參見下面的詳細安裝部分。]
Linux下OpenSSL的使用
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 $
基于Socket實現TCP通信,一人實現服務器,一人實現客戶端
2017-2018-1 20155222 201552228 實驗三-并發程序
研究OpenSSL算法,測試對稱算法中的AES,非對稱算法中的RSA,Hash算法中的MD5
使用Openssl的AES加密算法
實現對“wc服務器”的混合密碼系統防護
#include <openssl/ssl.h> #include <openssl/err.h>int SSL_library_int(void);//OpenSSL初始化:在使用OpenSSL之前,必須進行相應的協議初始化工作,SSL_CTX *SSL_CTX_new(SSL_METHOD * method);//創建會話環境:在OpenSSL中創建的SSL會話環境稱為CTX,使用不同的協議會話,其環境也不一樣的。int SSL_CTX_set_verify(SSL_CTX *ctx,int mode,int(*verify_callback),int(X509_STORE_CTX *));//制定證書驗證方式:當SSL會話環境申請成功后,還要根據實際的需要設置CTX的屬性,通常的設置是指定SSL握手階段證書的驗證方式和加載自己的證書。SSL_CTX_load_verify_location(SSL_CTX *ctx,const char *Cafile,const char *Capath);//為SSL會話環境加載CA證書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);//在將證書和私鑰加載到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);//綁定只寫套接字int SSL_connect(SSL *ssl);//客戶端在成功創建SSL套接字后,應使用函數SSL_connect( )替代傳統的函數connect( )來完成握手過程int SSL_accept(SSL *ssl);//對服務器來講使用函數SSL_ accept ( )替代傳統的函數accept ( )來完成握手過程X509 *SSL_get_peer_certificate(SSL *ssl);//握手過程完成之后,通常需要詢問通信雙方的證書信息,以便進行相應的驗證X509_NAME *X509_get_subject_name(X509 *a);//該函數可以從SSL套接字中提取對方的證書信息,這些信息已經被SSL驗證過了。int SSL_read(SSL *ssl,void *buf,int num);//當SSL握手完成之后,就可以進行安全的數據傳輸了,在數據傳輸階段,需要使用SSL_read( )和SSL_write( )來替代傳統的read( )和write( )函數,來完成對套接字的讀寫操作int SSL_write(SSL *ssl,const void *buf,int num);int SSL_shutdown(SSL *ssl);//關閉SSL套接字void SSl_free(SSL *ssl);//釋放SSL套接字void SSL_CTX_free(SSL_CTX *ctx); //釋放SSL會話環境 #include<netinet/in.h> // sockaddr_in …… #include <openssl/ssl.h> #include <openssl/err.h> …… #include<string.h> // bzero#define SERVER_PORT 8000 #define LENGTH_OF_LISTEN_QUEUE 20 #define BUFFER_SIZE 1024 #define FILE_NAME_MAX_SIZE 512 #define MAX 10000000 #define MAXBUF 1024int main(void) { // 聲明并初始化一個服務器端的socket地址結構 struct sockaddr_in server_addr; …… server_addr.sin_port = htons(SERVER_PORT); SSL_CTX *ctx; //ssl數據結構/* SSL 庫初始化 */ SSL_library_init();/* 載入所有 SSL 算法 */ OpenSSL_add_all_algorithms();/* 載入所有 SSL 錯誤消息 */ SSL_load_error_strings();/* 以 SSL V2 和 V3 標準兼容方式產生一個 SSL_CTX ,即 SSL Content Text */ ctx = SSL_CTX_new(SSLv23_server_method());/* 也可以用 SSLv2_server_method() 或 SSLv3_server_method() 單獨表示 V2 或 V3標準 */ 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);}// 創建socket,若成功,返回socket描述符 int server_socket_fd = socket(PF_INET, SOCK_STREAM, 0); ……// 綁定socket和socket地址結構 ……// socket監聽 ……while(1){SSL *ssl;// 定義客戶端的socket地址結構struct sockaddr_in client_addr;socklen_t client_addr_length = sizeof(client_addr);// 接受連接請求,返回一個新的socket(描述符),這個新socket用于同連接的客戶端通信// accept函數會把連接到的客戶端信息寫到client_addr中int new_server_socket_fd = accept(server_socket_fd, (struct sockaddr*)&client_addr, &client_addr_length);……/* 基于 ctx 產生一個新的 SSL */ssl = SSL_new(ctx);/* 將連接用戶的 socket 加入到 SSL */SSL_set_fd(ssl, new_server_socket_fd);/* 建立 SSL 連接 */if (SSL_accept(ssl) == -1) {perror("accept");close(new_fd);break;}// recv函數接收數據到緩沖區buffer中char buffer[BUFFER_SIZE];bzero(buffer, BUFFER_SIZE);if(recv(new_server_socket_fd, buffer, BUFFER_SIZE, 0) < 0){perror("Server Recieve Data Failed:");break;}// 然后從buffer(緩沖區)拷貝到file_name中int len = SSL_read(ssl, buffer, MAXBUF);if (len > 0)printf("接收消息成功:'%s',共%d個字節的數據\n", buffer, len);elseprintf("消息接收失敗!錯誤代碼是%d,錯誤信息是'%s'\n",errno, strerror(errno));char file_name[FILE_NAME_MAX_SIZE+1];……// 打開文件并讀取文件數據FILE *fp = fopen(file_name, "r");if(NULL == fp){printf("File:%s Not Found\n", file_name);}else{//printf("buffer:%s\n",buffer);//buffer為filenamechar *argv[]={"wc","-w",file_name,0};execvp( "wc" ,argv);fclose(fp);/* 關閉 SSL 連接 */SSL_shutdown(ssl);/* 釋放 SSL */SSL_free(ssl);}// 關閉與客戶端的連接close(new_server_socket_fd);} // 關閉監聽用的socket close(server_socket_fd);/* 釋放 CTX */ SSL_CTX_free(ctx);return 0; }問題解決
問題:輸入./configue會報錯說找不到這個命令**
解決辦法
直接百度openssl找到官網進去,找到下載鏈接鏈接到Github下載.zip文件
在文件下載目錄里輸入命令解壓.zip文件
解壓完成后使用cd ./oenpssl-master命令進入解壓文件的目錄中再使用ls命令會看到這個文件里有一個ReadMe
使用'./ReadMe'打開文檔,里面有詳細的安裝教程
INSTALLATION ON THE UNIX PLATFORM
Quick Start快速開始
-----------
If you want to just get on with it, do:如果你只是想快速上手做好使用準備,請執行以下操作:
$ ./config
$ make
$ make test
$ make install
[If any of these steps fails, see section Installation in Detail below.][如果這些步驟中的任何一個失敗,請參見下面的詳細安裝部分。]
PSP時間統計
| 需求分析 | 10min | 8% |
| 設計 | 20min | 16% |
| 代碼實現 | 60min | 50% |
| 測試 | 10min | 8% |
| 總結分析 | 20min | 16% |
參考資料
Linux中的./configure息
安裝openssl錯誤解決
fatal error: openssl/evp.h: 沒有那個文件或目錄
如何利用OpenSSL庫進行RSA加密和解密
使用Openssl的AES加密算法
轉載于:https://www.cnblogs.com/besti20155228/p/8053618.html
總結
以上是生活随笔為你收集整理的2017-2018-1 20155222 201552228 实验五 通讯协议设计的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【VMware vSphere】VMwa
- 下一篇: 个人每日总结1