2017-2018-1 20155201 实验五 通讯协议设计
生活随笔
收集整理的這篇文章主要介紹了
2017-2018-1 20155201 实验五 通讯协议设计
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
2017-2018-1 20155201 實驗五 固件程序設計
一、實驗內容
二、實驗步驟
在官網的下載地址下載zip包并解壓
- 在命令行中輸入
編寫一個測試代碼test_openssl.c
- 注意剛才記下來的庫所在路徑
- 對稱加密:對稱加密需要使用的標準命令為 enc
- AES:
RSA:
MD5:
- 頭文件:
- SSL庫初始化
- 載入所有 SSL 算法
- 載入所有 SSL 錯誤消息
- 產生一個 SSL_CTX
- 載入用戶的數字證書
- 載入用戶私鑰
- 基于 ctx 產生一個新的 SSL,并將連接用戶的 socket 加入到 SSL
- 建立 SSL 連接
- SSL數據傳輸
- 客戶端與服務器傳輸完數據后,關閉 SSL 連接,釋放 SSL
- 釋放 CTX
代碼已上傳至碼云:
#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; }三、實驗過程中遇到的問題和解決方案
- 問題1:安裝OpenSSL環境的時候,一切按照步驟來,在編寫測試文件的時候還是出現了無法識別頭文件的錯誤,我沒截圖,終端提示error:cannnot found #include <openssl/evp.h>的錯誤
- 問題1解決方案:各種百度,在知乎里找到一個回答:Mac10.10 brew安裝PHP提示Cannot find OpenSSL's <evp.h>
里面提示安裝Xcode命令行
然后居然就可以了,也不會再報錯,可以運行測試代碼
四、實驗體會與總結
本次實驗在MAC OS系統下也可以完成,需要特別注意的是靜態庫動態庫的鏈接,以及頭文件的使用,對于OpenSSL的使用我們還不是很熟悉,很多步驟都是一邊網上查資料一邊百度一邊嘗試著寫的,這也耗費了一些時間,不過網上對于OpenSSL的研究很多,能參考的資料就更豐富了,花時間學習就會有很多收獲。
五、參考資料
- Mac10.10 brew安裝PHP提示Cannot find OpenSSL's <evp.h>
- Linux下OpenSSL的安裝與使用
- 利用openssl進行RSA加密解密
- openssl 對稱加密算法enc命令詳解
- openssl用法詳解
轉載于:https://www.cnblogs.com/zhuohua/p/8030486.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的2017-2018-1 20155201 实验五 通讯协议设计的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HTML5 Web SQL数据库
- 下一篇: 禁用Browser Link