2017-2018-1 20155201 实验五 通讯协议设计
生活随笔
收集整理的這篇文章主要介紹了
2017-2018-1 20155201 实验五 通讯协议设计
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
2017-2018-1 20155201 實(shí)驗(yàn)五 固件程序設(shè)計(jì)
一、實(shí)驗(yàn)內(nèi)容
二、實(shí)驗(yàn)步驟
在官網(wǎng)的下載地址下載zip包并解壓
- 在命令行中輸入
編寫一個(gè)測試代碼test_openssl.c
- 注意剛才記下來的庫所在路徑
- 對稱加密:對稱加密需要使用的標(biāo)準(zhǔn)命令為 enc
- AES:
RSA:
MD5:
- 頭文件:
- SSL庫初始化
- 載入所有 SSL 算法
- 載入所有 SSL 錯(cuò)誤消息
- 產(chǎn)生一個(gè) SSL_CTX
- 載入用戶的數(shù)字證書
- 載入用戶私鑰
- 基于 ctx 產(chǎn)生一個(gè)新的 SSL,并將連接用戶的 socket 加入到 SSL
- 建立 SSL 連接
- SSL數(shù)據(jù)傳輸
- 客戶端與服務(wù)器傳輸完數(shù)據(jù)后,關(guān)閉 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) { // 聲明并初始化一個(gè)服務(wù)器端的socket地址結(jié)構(gòu) struct sockaddr_in server_addr; …… server_addr.sin_port = htons(SERVER_PORT); SSL_CTX *ctx; //ssl數(shù)據(jù)結(jié)構(gòu)/* SSL 庫初始化 */ SSL_library_init();/* 載入所有 SSL 算法 */ OpenSSL_add_all_algorithms();/* 載入所有 SSL 錯(cuò)誤消息 */ SSL_load_error_strings();/* 以 SSL V2 和 V3 標(biāo)準(zhǔn)兼容方式產(chǎn)生一個(gè) SSL_CTX ,即 SSL Content Text */ ctx = SSL_CTX_new(SSLv23_server_method());/* 也可以用 SSLv2_server_method() 或 SSLv3_server_method() 單獨(dú)表示 V2 或 V3標(biāo)準(zhǔn) */ if (ctx == NULL) {ERR_print_errors_fp(stdout);exit(1);}/* 載入用戶的數(shù)字證書, 此證書用來發(fā)送給客戶端。 證書里包含有公鑰 */ 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);}// 創(chuàng)建socket,若成功,返回socket描述符 int server_socket_fd = socket(PF_INET, SOCK_STREAM, 0); ……// 綁定socket和socket地址結(jié)構(gòu) ……// socket監(jiān)聽 ……while(1){SSL *ssl;// 定義客戶端的socket地址結(jié)構(gòu)struct sockaddr_in client_addr;socklen_t client_addr_length = sizeof(client_addr);// 接受連接請求,返回一個(gè)新的socket(描述符),這個(gè)新socket用于同連接的客戶端通信// accept函數(shù)會(huì)把連接到的客戶端信息寫到client_addr中int new_server_socket_fd = accept(server_socket_fd, (struct sockaddr*)&client_addr, &client_addr_length);……/* 基于 ctx 產(chǎn)生一個(gè)新的 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函數(shù)接收數(shù)據(jù)到緩沖區(qū)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(緩沖區(qū))拷貝到file_name中int len = SSL_read(ssl, buffer, MAXBUF);if (len > 0)printf("接收消息成功:'%s',共%d個(gè)字節(jié)的數(shù)據(jù)\n", buffer, len);elseprintf("消息接收失敗!錯(cuò)誤代碼是%d,錯(cuò)誤信息是'%s'\n",errno, strerror(errno));char file_name[FILE_NAME_MAX_SIZE+1];……// 打開文件并讀取文件數(shù)據(jù)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);/* 關(guān)閉 SSL 連接 */SSL_shutdown(ssl);/* 釋放 SSL */SSL_free(ssl);}// 關(guān)閉與客戶端的連接close(new_server_socket_fd);} // 關(guān)閉監(jiān)聽用的socket close(server_socket_fd);/* 釋放 CTX */ SSL_CTX_free(ctx);return 0; }三、實(shí)驗(yàn)過程中遇到的問題和解決方案
- 問題1:安裝OpenSSL環(huán)境的時(shí)候,一切按照步驟來,在編寫測試文件的時(shí)候還是出現(xiàn)了無法識(shí)別頭文件的錯(cuò)誤,我沒截圖,終端提示error:cannnot found #include <openssl/evp.h>的錯(cuò)誤
- 問題1解決方案:各種百度,在知乎里找到一個(gè)回答:Mac10.10 brew安裝PHP提示Cannot find OpenSSL's <evp.h>
里面提示安裝Xcode命令行
然后居然就可以了,也不會(huì)再報(bào)錯(cuò),可以運(yùn)行測試代碼
四、實(shí)驗(yàn)體會(huì)與總結(jié)
本次實(shí)驗(yàn)在MAC OS系統(tǒng)下也可以完成,需要特別注意的是靜態(tài)庫動(dòng)態(tài)庫的鏈接,以及頭文件的使用,對于OpenSSL的使用我們還不是很熟悉,很多步驟都是一邊網(wǎng)上查資料一邊百度一邊嘗試著寫的,這也耗費(fèi)了一些時(shí)間,不過網(wǎng)上對于OpenSSL的研究很多,能參考的資料就更豐富了,花時(shí)間學(xué)習(xí)就會(huì)有很多收獲。
五、參考資料
- Mac10.10 brew安裝PHP提示Cannot find OpenSSL's <evp.h>
- Linux下OpenSSL的安裝與使用
- 利用openssl進(jìn)行RSA加密解密
- openssl 對稱加密算法enc命令詳解
- openssl用法詳解
轉(zhuǎn)載于:https://www.cnblogs.com/zhuohua/p/8030486.html
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的2017-2018-1 20155201 实验五 通讯协议设计的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HTML5 Web SQL数据库
- 下一篇: 禁用Browser Link