日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

2017-2018-1 20155201 实验五 通讯协议设计

發布時間:2025/5/22 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2017-2018-1 20155201 实验五 通讯协议设计 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2017-2018-1 20155201 實驗五 固件程序設計

一、實驗內容

  • 安裝OpenSSL環境,并編寫測試代碼驗證無誤
  • 研究OpenSSL算法,測試對稱算法中的AES,非對稱算法中的RSA,Hash算法中的MD5
  • 在Ubuntu中實現對實驗二中的“wc服務器”通過混合密碼系統進行防護
  • 二、實驗步驟

  • 安裝OpenSSL環境,并編寫測試代碼驗證無誤
    • 在官網的下載地址下載zip包并解壓

    • 在命令行中輸入
    ./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); elseprintf("消息接收失敗!錯誤代碼是%d,錯誤信息是'%s'\n",errno, strerror(errno));
    • 客戶端與服務器傳輸完數據后,關閉 SSL 連接,釋放 SSL
    SSL_shutdown(ssl);SSL_free(ssl);
    • 釋放 CTX
    SSL_CTX_free(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命令行
    xcode-select --install

    然后居然就可以了,也不會再報錯,可以運行測試代碼

    四、實驗體會與總結

    本次實驗在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 实验五 通讯协议设计的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。