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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

使用wireshark抓包,本地环回测试通信数据已经通过SM4国密算法加密

發(fā)布時(shí)間:2023/12/13 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用wireshark抓包,本地环回测试通信数据已经通过SM4国密算法加密 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

具體操作

  • 本實(shí)驗(yàn)采用 本地環(huán)回測(cè)試
  • 開(kāi)啟wireshark抓包工具,設(shè)定端口號(hào) tcp.port == 5099 (5099為服務(wù)端對(duì)外開(kāi)啟服務(wù)的端口號(hào)),不可以使用ip.addr指定ip地址,因?yàn)楸镜丨h(huán)回測(cè)試,相關(guān)信息太多,使用端口抓包最為簡(jiǎn)單
  • 首先開(kāi)啟服務(wù)端,然后開(kāi)啟客戶端,服務(wù)端開(kāi)啟之后輸出 "Bind returned success",并輸出客戶端連接通信使用的端口號(hào),然后客戶端會(huì)使用socket通信傳輸經(jīng)過(guò)SM4對(duì)稱(chēng)加密算法加密返回的密文
  • 密文存儲(chǔ)格式是字符串,表示形式是十六進(jìn)制;socket通信的時(shí)候會(huì)將這個(gè)字符串再次編碼為十六進(jìn)制,因此使用wireshark抓包數(shù)據(jù)之后 需要對(duì)攔截的數(shù)據(jù)進(jìn)行解碼 (十六進(jìn)制 轉(zhuǎn) 字符串)
  • hex轉(zhuǎn)str - 在線工具
  • 客戶端發(fā)送數(shù)據(jù)完畢之后,輸出Client:sending data test,請(qǐng)按任意鍵退出
  • 服務(wù)端打印輸出 客戶端發(fā)送數(shù)據(jù)的數(shù)據(jù) 以及對(duì)應(yīng)的長(zhǎng)度等信息,輸出 Connect closed,結(jié)束通信

服務(wù)端

?客戶端

?wireshark抓包

  • 客戶端 端口號(hào) 向 服務(wù)端 端口號(hào) 發(fā)送33字節(jié)數(shù)據(jù)

  • ?點(diǎn)擊 Data,查看下窗口,左邊是數(shù)據(jù)的十六進(jìn)制,右邊是字符串

  • ?將wireshark抓到的數(shù)據(jù)和server接收到的數(shù)據(jù)對(duì)比,數(shù)據(jù)一致
  • 表明客戶端和發(fā)送端數(shù)據(jù)傳輸是經(jīng)過(guò)SM4算法加密的

參考鏈接

  • https://blog.csdn.net/CHYabc123456hh/article/details/122049078
  • SM4 ECB加密模式 數(shù)據(jù)對(duì)比試驗(yàn)論證_CHYabc123456hh的博客-CSDN博客
  • 數(shù)據(jù)填充規(guī)則之PKCS7_CHYabc123456hh的博客-CSDN博客
  • C++ Byte轉(zhuǎn)十六進(jìn)制字符串輸出_CHYabc123456hh的博客-CSDN博客
  • 使用國(guó)密瀏覽器和使用Wireshark進(jìn)行國(guó)密抓包_CHYabc123456hh的博客-CSDN博客_gmssl wireshark
  • Socket代碼實(shí)現(xiàn)服務(wù)端 和 客戶端之間通信_(tái)CHYabc123456hh的博客-CSDN博客_c++實(shí)現(xiàn)客戶端socket
  • Socket編程 涵蓋代碼和函數(shù)參數(shù)介紹_CHYabc123456hh的博客-CSDN博客
  • 本地搭建server和客戶端使用端口進(jìn)行數(shù)據(jù)通信,使用Wireshark抓取127.0.0.1環(huán)回地址并分析通信數(shù)據(jù)_CHYabc123456hh的博客-CSDN博客
  • 驗(yàn)證客戶端和服務(wù)端可以傳輸經(jīng)SM4加密的密文數(shù)據(jù),從而驗(yàn)證發(fā)送數(shù)據(jù)已使用服務(wù)器密碼機(jī)進(jìn)行SM4加密,而不是隨便的字符串亂碼_CHYabc123456hh的博客-CSDN博客

服務(wù)端代碼

// sdf_cpp_warpper.cpp : 此文件包含 "main" 函數(shù)。程序執(zhí)行將在此處開(kāi)始并結(jié)束。 // server端#ifndef UNICODE #define UNICODE #endif#define WIN32_LEAN_AND_MEAN#include <iostream> #include <string> #include <sstream> #include <vector> #include <iomanip> #include <winsock2.h> #include <Ws2tcpip.h> #include <stdio.h>#include "sdf_warpper.hpp" #include "cstring"#pragma comment(lib, "Ws2_32.lib") #pragma comment(lib,"libhsm_core.lib")#define DEFAULT_BUFLEN 1024 using namespace std;typedef std::vector<unsigned char> bytes; std::string BytesToStr(const bytes& in) {bytes::const_iterator from = in.cbegin();bytes::const_iterator to = in.cend();std::ostringstream oss;for (; from != to; ++from)oss << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>(*from);return oss.str(); }void sm4_encrypt_decrypt_demo() {sdf_qax::SDF_warpper sdf_warpper("{\"device_type\": \"rpc\",\"device_socket\": \"172.22.14.231:5000\"}");//char a[16] = { '1','0','0','0','0','2','4','5','6','7','2','1','3','4','5','6' };char a[]{ '0','0','0','0','0','0','0','0','0','0','0','0','0','0' };//char a[]{ 00,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };//std::cout << "input_data: ";std::cout << "char類(lèi)型數(shù)據(jù): "; /* for (auto i : a) {std::cout << i << " ";} *///std::cout << std::endl; bytes input(a, a + 15);for (auto i : input) {std::cout << i;} std::cout << std::endl;std::cout << "char類(lèi)型數(shù)據(jù) 轉(zhuǎn)十六進(jìn)制 輸出: ";std::cout << BytesToStr(input) << std::endl; char outbuffer[32]{ 0 };int out_buffer_true_length = 0;sdf_warpper.sm4_symmetry_encrypt((uint8_t *)sdf_warpper.getStaticKey(), a, sizeof(a) / sizeof(char), outbuffer, &out_buffer_true_length);std::cout << "cipher data with padding length: " << out_buffer_true_length << std::endl;char static_key[16] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };bytes input_3(static_key, static_key + 15);std::cout << "static_key數(shù)據(jù) 轉(zhuǎn)十六進(jìn)制 輸出: ";std::cout << BytesToStr(input_3) << std::endl;/* for (char i : outbuffer) {std::cout << i;} */bytes input_2(outbuffer, outbuffer + out_buffer_true_length);std::cout << "密文數(shù)據(jù)輸出:";std::cout << BytesToStr(input_2) << std::endl;//std::cout << std::endl;std::cout << "true array length: " << strlen(outbuffer) << std::endl;char decrypt_result[32]{ 0 };int out_true_length = 0;sdf_warpper.sm4_symmetry_decrypt((uint8_t *)sdf_warpper.getStaticKey(), outbuffer, out_buffer_true_length, decrypt_result, &out_true_length);std::cout << "decrypt result data: ";for (int i = 0; i < strlen(decrypt_result); i++) {std::cout << decrypt_result[i];}std::cout << std::endl; }ECCCipher cipher; //密文存儲(chǔ)結(jié)構(gòu)體void sm2_encrypt_decrypt_demo() {sdf_qax::SDF_warpper sdf_warpper2("{\"device_type\": \"rpc\",\"device_socket\": \"172.22.14.231:5000\"}");char a[]{ '3','4','5' };std::cout << "input_data: ";for (char i : a) {std::cout << i;}std::cout << std::endl;sdf_warpper2.sm2_internal_encrypt(1, a, 3, &cipher);char decrypt_result[256]{ 0 };int out_true_length = 0;sdf_warpper2.sm2_internal_decrypt(1, &cipher, reinterpret_cast<sdf_uint8_t *>(decrypt_result), &out_true_length, nullptr, 0);std::cout << "Data length after decryption: " << out_true_length << std::endl;std::cout << "Data after decryption: ";for (int i = 0; i < out_true_length; i++) {std::cout << decrypt_result[i];}std::cout << std::endl; }void main() {//Initialze winsockWSADATA wsaData;if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0){std::cout << "Can't Initialize winsock!Quiting!" << std::endl;;return;}//Creste a sockrtSOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0);if (sockSrv == INVALID_SOCKET) {wprintf(L"Can't create a socket with error %d\n", WSAGetLastError());WSACleanup();return;}//Bind the socket to an ip address and portint port = 5099;SOCKADDR_IN addrSrv;addrSrv.sin_family = AF_INET;addrSrv.sin_port = htons(port); //1024以上的端口號(hào)addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//Bind the socketint retVal = bind(sockSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));if (retVal == SOCKET_ERROR) {printf("Failed bind:%d\n", WSAGetLastError());closesocket(sockSrv);WSACleanup();return;}else {std::cout << "Bind returned success" << std::endl;}//Tell winsock the socket is for listeningif (listen(sockSrv, SOMAXCONN) == SOCKET_ERROR) {printf("Listen failed:%d", WSAGetLastError());return;}//wait for a connectionSOCKADDR_IN addrClient;int clientSize = sizeof(addrClient);SOCKET sockConn = accept(sockSrv, (SOCKADDR*)&addrClient, &clientSize);if (sockConn == SOCKET_ERROR) {wprintf(L"accept failed with error: %ld\n", WSAGetLastError());closesocket(sockSrv);WSACleanup();return;}char host[NI_MAXHOST]; //Client's remote namechar service[NI_MAXSERV]; //Service (i.e. port)the client is connect onZeroMemory(host, NI_MAXHOST);//Same as memset(host,0,NI_MAXHOST)ZeroMemory(service, NI_MAXSERV);if (getnameinfo((sockaddr*)&addrClient, sizeof(addrClient), host, NI_MAXHOST, service, NI_MAXSERV, 0) == 0) {std::cout << "connect on port " << service << std::endl;}else {inet_ntop(AF_INET, &addrClient.sin_addr, host, NI_MAXHOST);std::cout << host << " connect on port " << ntohs(addrClient.sin_port) << std::endl;}//while loop:accept and echo message back to clientchar recvbuf[DEFAULT_BUFLEN] = "";int recvbuflen = DEFAULT_BUFLEN;memset(recvbuf, 0, sizeof(recvbuf));char sendbuf[] = "Client: sending data test\n";retVal = send(sockConn, sendbuf, sizeof(sendbuf), 0);if (retVal == SOCKET_ERROR) {wprintf(L"send failed with error: %d\n", WSAGetLastError());closesocket(sockSrv);WSACleanup();return;}do {retVal = recv(sockConn, recvbuf, recvbuflen, 0);if (retVal > 0) {wprintf(L"Bytes received: %d\n", retVal);printf("%s\n", recvbuf);}else if (retVal == 0)wprintf(L"Connection closed\n");elsewprintf(L"recv failed with error: %d\n", WSAGetLastError());} while (retVal > 0);closesocket(sockConn);//close socketclosesocket(sockSrv);//close winsockWSACleanup();system("pause"); }// 運(yùn)行程序: Ctrl + F5 或調(diào)試 >“開(kāi)始執(zhí)行(不調(diào)試)”菜單 // 調(diào)試程序: F5 或調(diào)試 >“開(kāi)始調(diào)試”菜單// 入門(mén)使用技巧: // 1. 使用解決方案資源管理器窗口添加/管理文件 // 2. 使用團(tuán)隊(duì)資源管理器窗口連接到源代碼管理 // 3. 使用輸出窗口查看生成輸出和其他消息 // 4. 使用錯(cuò)誤列表窗口查看錯(cuò)誤 // 5. 轉(zhuǎn)到“項(xiàng)目”>“添加新項(xiàng)”以創(chuàng)建新的代碼文件,或轉(zhuǎn)到“項(xiàng)目”>“添加現(xiàn)有項(xiàng)”以將現(xiàn)有代碼文件添加到項(xiàng)目 // 6. 將來(lái),若要再次打開(kāi)此項(xiàng)目,請(qǐng)轉(zhuǎn)到“文件”>“打開(kāi)”>“項(xiàng)目”并選擇 .sln 文件

客戶端代碼

// sdf_cpp_warpper.cpp : 此文件包含 "main" 函數(shù)。程序執(zhí)行將在此處開(kāi)始并結(jié)束。 // client端#ifndef UNICODE #define UNICODE #endif#define WIN32_LEAN_AND_MEAN#include <iostream> #include <stdio.h> #include <string> #include <sstream> #include <vector> #include <iomanip> #include <winsock2.h> #include <Ws2tcpip.h>#include "sdf_warpper.hpp" #include "cstring"#pragma comment(lib,"libhsm_core.lib") #pragma comment(lib, "Ws2_32.lib") using namespace std;typedef std::vector<unsigned char> bytes; std::string BytesToStr(const bytes& in) {bytes::const_iterator from = in.cbegin();bytes::const_iterator to = in.cend();std::ostringstream oss;for (; from != to; ++from)oss << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>(*from);return oss.str(); }void sm4_encrypt_decrypt_demo(char* outbuffer,int & out_buffer_true_length) {sdf_qax::SDF_warpper sdf_warpper("{\"device_type\": \"rpc\",\"device_socket\": \"172.22.14.231:5000\"}");//char a[16] = { '1','0','0','0','0','2','4','5','6','7','2','1','3','4','5','6' };char a[]{ '0','0','0','0','0','0','0','0','0','0','0','0','0','0','0' };//char a[]{ 00,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };//std::cout << "input_data: ";//std::cout << "char類(lèi)型數(shù)據(jù): ";/* for (auto i : a) {std::cout << i << " ";} *///std::cout << std::endl; bytes input(a, a + 15); /* for (auto i : input) {std::cout << i;}std::cout << std::endl;std::cout << "char類(lèi)型數(shù)據(jù) 轉(zhuǎn)十六進(jìn)制 輸出: ";std::cout << BytesToStr(input) << std::endl; *///char outbuffer[32]{ 0 };//int out_buffer_true_length = 0;sdf_warpper.sm4_symmetry_encrypt((uint8_t*)sdf_warpper.getStaticKey(), a, sizeof(a) / sizeof(char), outbuffer, &out_buffer_true_length); // std::cout << "cipher data with padding length: " << out_buffer_true_length << std::endl;char static_key[16] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };bytes input_3(static_key, static_key + 15); /* std::cout << "static_key數(shù)據(jù) 轉(zhuǎn)十六進(jìn)制 輸出: ";std::cout << BytesToStr(input_3) << std::endl; *//* for (char i : outbuffer) {std::cout << i;} */bytes input_2(outbuffer, outbuffer + out_buffer_true_length);//std::cout << "密文數(shù)據(jù)輸出:";//std::cout << BytesToStr(input_2) << std::endl;//std::cout << std::endl; // std::cout << "true array length: " << strlen(outbuffer) << std::endl;char decrypt_result[32]{ 0 };int out_true_length = 0;sdf_warpper.sm4_symmetry_decrypt((uint8_t*)sdf_warpper.getStaticKey(), outbuffer, out_buffer_true_length, decrypt_result, &out_true_length);//std::cout << "decrypt result data: "; /* for (int i = 0; i < strlen(decrypt_result); i++) {std::cout << decrypt_result[i]; } */std::cout << std::endl; } ECCCipher cipher; //密文存儲(chǔ)結(jié)構(gòu)體void sm2_encrypt_decrypt_demo() {sdf_qax::SDF_warpper sdf_warpper2("{\"device_type\": \"rpc\",\"device_socket\": \"172.22.14.231:5000\"}"); char a[]{ '3','4','5' };std::cout << "input_data: ";for (char i : a) {std::cout << i;}std::cout << std::endl;sdf_warpper2.sm2_internal_encrypt(1, a, 3, &cipher);char decrypt_result[256]{ 0 };int out_true_length = 0;sdf_warpper2.sm2_internal_decrypt(1, &cipher, reinterpret_cast<sdf_uint8_t *>(decrypt_result), &out_true_length, nullptr, 0);std::cout << "Data length after decryption: " << out_true_length << std::endl;std::cout << "Data after decryption: ";for (int i = 0; i < out_true_length; i++) {std::cout << decrypt_result[i];}std::cout << std::endl; }void main() {//Initialze winsockWSADATA wsaData;if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0){std::cout << "Can't Initialize winsock!Quiting!" << std::endl;;return;}//Creste a sockrtSOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0);if (sockClient == INVALID_SOCKET) {wprintf(L"Can't create a socket with error %d\n", WSAGetLastError());WSACleanup();return;}//Bind the socket to an ip address and portint port = 5099;SOCKADDR_IN addrSrv;addrSrv.sin_family = AF_INET;addrSrv.sin_port = htons(5099);//addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");inet_pton(AF_INET, "127.0.0.1", &addrSrv.sin_addr.S_un.S_addr);char buff[1024];memset(buff, 0, sizeof(buff));//向服務(wù)器發(fā)出連接請(qǐng)求if (connect(sockClient, (struct sockaddr*) & addrSrv, sizeof(addrSrv)) == INVALID_SOCKET) {printf("Connect failed:%d", WSAGetLastError());return;}else{//接收數(shù)據(jù)recv(sockClient, buff, sizeof(buff), 0);printf("%s\n", buff);}//發(fā)送數(shù)據(jù)//const char* buffSend = "hello, this is a Client....";//send(sockClient, buffSend, strlen(buffSend) + 1, 0);// char sendbuf[BUFSIZ]; // ZeroMemory(sendbuf, BUFSIZ); /* strcpy_s(sendbuf, str.c_str());if (send(sockClient, sendbuf, strlen(sendbuf) + 1, 0) == SOCKET_ERROR) {wprintf(L"send failed with error: %d\n", WSAGetLastError());closesocket(sockClient);WSACleanup();break;}*/char outbuffer[32]{ 0 };int out_buffer_true_length = 0;sm4_encrypt_decrypt_demo(outbuffer,out_buffer_true_length);bytes input_2(outbuffer, outbuffer + out_buffer_true_length);//std::cout << "密文數(shù)據(jù)輸出:";//std::cout << BytesToStr(input_2) << std::endl;//printf("%d", strlen(buffSend) + 1);std::string return_value(BytesToStr(input_2));//std::cout << return_value << std::endl;char sendbuf[BUFSIZ];ZeroMemory(sendbuf, BUFSIZ);strcpy_s(sendbuf, return_value.c_str());if (send(sockClient, sendbuf, strlen(sendbuf) + 1, 0) == SOCKET_ERROR) {wprintf(L"send failed with error: %d\n", WSAGetLastError());closesocket(sockClient);WSACleanup();exit(-1);}//關(guān)閉套接字closesocket(sockClient);WSACleanup();system("pause");}// 運(yùn)行程序: Ctrl + F5 或調(diào)試 >“開(kāi)始執(zhí)行(不調(diào)試)”菜單 // 調(diào)試程序: F5 或調(diào)試 >“開(kāi)始調(diào)試”菜單// 入門(mén)使用技巧: // 1. 使用解決方案資源管理器窗口添加/管理文件 // 2. 使用團(tuán)隊(duì)資源管理器窗口連接到源代碼管理 // 3. 使用輸出窗口查看生成輸出和其他消息 // 4. 使用錯(cuò)誤列表窗口查看錯(cuò)誤 // 5. 轉(zhuǎn)到“項(xiàng)目”>“添加新項(xiàng)”以創(chuàng)建新的代碼文件,或轉(zhuǎn)到“項(xiàng)目”>“添加現(xiàn)有項(xiàng)”以將現(xiàn)有代碼文件添加到項(xiàng)目 // 6. 將來(lái),若要再次打開(kāi)此項(xiàng)目,請(qǐng)轉(zhuǎn)到“文件”>“打開(kāi)”>“項(xiàng)目”并選擇 .sln 文件

總結(jié)

以上是生活随笔為你收集整理的使用wireshark抓包,本地环回测试通信数据已经通过SM4国密算法加密的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。