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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

数据採集器服务——Socket(今天才发现AES加解密代码跟贴的时候不一样,貌似乱码,不知什么情况)...

發布時間:2024/9/21 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据採集器服务——Socket(今天才发现AES加解密代码跟贴的时候不一样,貌似乱码,不知什么情况)... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

近期剛做的一個項目。關于 Socket TCP 通信。

需求方提供了一個 ARM 機器,及數據採集器,須要我做一個服務端與數據採集器進行交互。


目的:

數據採集器:定時將讀取到的數據發送到服務端。

服務端:將數據採集器發送過來的數據保存在本地。


要求:

1、通信以 TCP 方式進行交互,port可配置。

2、自己實現握手、心跳包機制。

3、TCP 包結構包含:包頭、有效數據總長度、有效數據、CRC 校驗、包尾,當中有效數據包含指令序號和指令內容,為經過 AES 128位加密的 XML 數據。

4、加密算法:AES 128位。加密模式:CBC。填充模式:NoPadding。

5、握手過程:(下面過程均以 TCP 包結構加密形式傳輸,并僅僅提主要內容數據。省略 CRC 校驗說明)

(1)數據採集器發送請求包到服務端,服務端解析包結構后取出數據段進行 AES 解密。

(2)服務端推斷該包為請求包后回復一個包括一個隨機序列的包到數據採集器。

(3)數據採集器接收到包后將隨機序列與 MD5 密鑰組合后進行 MD5 加密。并回發給服務端。

(4)服務端接收到加密后的內容,并與本地加密后的內容進行比較,通過則回復 pass,否則回復 fail。

(5)數據採集器收到 pass 則握手成功并建立連接,否則握手失敗并斷開連接。

6、心跳包:握手建立后。採集器每隔一定時間會往服務端發送一個心跳包。服務端收到心跳包后應馬上應答。回復server當前時間信息供採集器校時。

7、數據包:採集器在握手建立后。會定時向服務端發送斷點數據包和實時數據包,服務端接收到以后將數據保存在本地 PC 并回復 pass。


1、創建服務端Socket

(C#)

IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 36829); //本機預使用的IP和portSocket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);newsock.Bind(ipep); //綁定newsock.Listen(10); //監聽

(Node.js)

var server = net.createServer(function(socket) { //'connection' listenerconsole.log('client connected'); }); server.listen(36829, function() { //'listening' listenerconsole.log('server bound'); });
2、創建client對象并監聽

(C#)

Console.WriteLine("waiting for a client"); Socket client = newsock.Accept(); //當有可用的客戶端連接嘗試時運行,并返回一個新的socket,用于與客戶端之間的通信 IPEndPoint clientip = (IPEndPoint)client.RemoteEndPoint; Console.WriteLine("connect with client: " + clientip.Address + " at port: " + clientip.Port); while (true) {byte[] buffer = new byte[1024]; //用于緩存客戶端所發送的信息,通過socket傳遞的信息必須為字節數組int packageLength = client.Receive(buffer); //用于表示客戶端發送的信息長度if (packageLength == 0){Console.WriteLine("解除循環監聽,Disconnected from " + clientip.Address);break; //當信息長度為0。說明客戶端連接斷開} }
(Node.js)

var server = net.createServer(function(socket) { //'connection' listenerconsole.log('client connected');socket.on('end', function() {console.log('client disconnected');});socket.on('data', function(data){console.log(data.length);console.log(data);}); }); server.listen(36829, function() { //'listening' listenerconsole.log('server bound'); });

由于其它內容涉及到保密性,所以以下僅僅貼一下 AES 加解密過程

// AES 解密 public static string AESDecrypt(byte[] data) {SymmetricAlgorithm aes = Rijndael.Create();aes.Key = keyArray; // 密鑰aes.IV = keyArray; // 向量aes.Mode = CipherMode.CBC;aes.Padding = PaddingMode.None;byte[] decryptBytes = new byte[data.Length];using (MemoryStream ms = new MemoryStream(data)){using (CryptoStream cs = new CryptoStream(ms, aes.CreateDecryptor(), CryptoStreamMode.Read)){cs.Read(decryptBytes, 0, decryptBytes.Length);cs.Close();ms.Close();}}aes.Clear();return System.Text.Encoding.Default.GetString(decryptBytes).Replace("\0", " "); }
// AES 加密 public static byte[] AESEncrypt(byte[] data) {SymmetricAlgorithm aes = Rijndael.Create();aes.Key = keyArray;aes.IV = keyArray;aes.Mode = CipherMode.CBC;aes.Padding = PaddingMode.None;using (MemoryStream ms = new MemoryStream()){using (CryptoStream cs = new CryptoStream(ms, aes.CreateEncryptor(), CryptoStreamMode.Write)){cs.Write(data, 0, data.Length);cs.FlushFinalBlock();byte[] cipherBytes = ms.ToArray(); // 得到加密后的字節數組cs.Close();ms.Close();aes.Clear();return cipherBytes;}} }

總結

以上是生活随笔為你收集整理的数据採集器服务——Socket(今天才发现AES加解密代码跟贴的时候不一样,貌似乱码,不知什么情况)...的全部內容,希望文章能夠幫你解決所遇到的問題。

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