C#实现数据包加密与解密实例详解

作者:shichen2014 时间:2022-05-14 18:44:50 

在很多项目中,为了安全安全考虑,需要对数据包进行加密处理,本文实例所述的即为C#加密代码,在应用开发中有很大的实用价值。说起数据包加密,其实对C#编程者来说,应该是一个基础的技巧,是进行C#程序设计人员必须要掌握的技能。

C#实现加密功能的核心代码如下:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Net;
using System.Net.Sockets;
using System.Net.NetworkInformation;
using System.Security.Cryptography;
using System.IO;
namespace EncryptDataReport
{
 public partial class Form1 : Form
 {
   public Form1()
   {
     InitializeComponent();
   }
   #region 定义全局对象及变量
   private IPEndPoint Server;//服务器端
   private IPEndPoint Client;//客户端
   private Socket mySocket;//套接字
   private EndPoint ClientIP;//IP地址
   byte[] buffer, data;//接收缓存
   bool blFlag = true;//标识是否第一次发送信息
   bool ISPort = false;//判断端口打开
   int SendNum1, ReceiveNum1, DisNum1; //记录窗体加载时的已发送\已接收\丢失的数据报
   int SendNum2, ReceiveNum2, DisNum2; //记录当前已发送\已接收\丢失的数据报
   int SendNum3, ReceiveNum3, DisNum3; //缓存已发送\已接收\丢失的数据报
   int port;//端口号
   #endregion
   //异步接收信息
   private void StartLister(IAsyncResult IAResult)
   {
     int Num = mySocket.EndReceiveFrom(IAResult, ref ClientIP);
     string strInfo = Encoding.Unicode.GetString(buffer, 0, Num);
     rtbContent.AppendText("用户" + ClientIP.ToString());
     rtbContent.AppendText(":");
     rtbContent.AppendText("\r\n");
     rtbContent.AppendText(DecryptDES(strInfo, "mrsoftxk"));//对接收到的信息进行解密
     rtbContent.AppendText("\r\n");
     mySocket.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref ClientIP, new AsyncCallback(StartLister), null);
   }
   //初始化已发送、已接收和丢失的数据报
   private void Form1_Load(object sender, EventArgs e)
   {
     if (blFlag == true)
     {
       IPGlobalProperties NetInfo = IPGlobalProperties.GetIPGlobalProperties();
       UdpStatistics myUdpStat = null;
       myUdpStat = NetInfo.GetUdpIPv4Statistics();
       SendNum1 = Int32.Parse(myUdpStat.DatagramsSent.ToString());
       ReceiveNum1 = Int32.Parse(myUdpStat.DatagramsReceived.ToString());
       DisNum1 = Int32.Parse(myUdpStat.IncomingDatagramsDiscarded.ToString());
     }
   }
   //设置端口号
   private void button4_Click(object sender, EventArgs e)
   {
     try
     {
       port = Convert.ToInt32(textBox4.Text);
       CheckForIllegalCrossThreadCalls = false;
       buffer = new byte[1024];
       data = new byte[1024];
       Server = new IPEndPoint(IPAddress.Any, port);
       Client = new IPEndPoint(IPAddress.Broadcast, port);
       ClientIP = (EndPoint)Server;
       mySocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
       mySocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1);
       mySocket.Bind(Server);
       mySocket.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref ClientIP, new AsyncCallback(StartLister), null);
       ISPort = true;//打开指定端口号
     }
     catch { }
   }
   //发送信息
   private void button2_Click(object sender, EventArgs e)
   {
     if (ISPort == true)//判断是否有打开的端口号
     {
       IPGlobalProperties NetInfo = IPGlobalProperties.GetIPGlobalProperties();
       UdpStatistics myUdpStat = null;
       myUdpStat = NetInfo.GetUdpIPv4Statistics();
       try
       {
         if (blFlag == false)//非第一次发送
         {
           SendNum2 = Int32.Parse(myUdpStat.DatagramsSent.ToString());
           ReceiveNum2 = Int32.Parse(myUdpStat.DatagramsReceived.ToString());
           DisNum2 = Int32.Parse(myUdpStat.IncomingDatagramsDiscarded.ToString());
           textBox1.Text = Convert.ToString(SendNum2 - SendNum3);
           textBox2.Text = Convert.ToString(ReceiveNum2 - ReceiveNum3);
           textBox3.Text = Convert.ToString(DisNum2 - DisNum3);
         }
         SendNum2 = Int32.Parse(myUdpStat.DatagramsSent.ToString());
         ReceiveNum2 = Int32.Parse(myUdpStat.DatagramsReceived.ToString());
         DisNum2 = Int32.Parse(myUdpStat.IncomingDatagramsDiscarded.ToString());
         SendNum3 = SendNum2; //记录本次的发送数据报
         ReceiveNum3 = ReceiveNum2;//记录本次的接收数据报
         DisNum3 = DisNum2; //记录本次的丢失数据报
         if (blFlag == true)//第一次发送
         {
           textBox1.Text = Convert.ToString(SendNum2 - SendNum1);
           textBox2.Text = Convert.ToString(ReceiveNum2 - ReceiveNum1);
           textBox3.Text = Convert.ToString(DisNum2 - DisNum1);
           blFlag = false;
         }
       }
       catch (Exception ex)
       {
         MessageBox.Show(ex.Message, "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
       }
       string str = EncryptDES(rtbSend.Text, "mrsoftxk");//加密要发送的信息
       data = Encoding.Unicode.GetBytes(str);
       mySocket.SendTo(data, data.Length, SocketFlags.None, Client);
       rtbSend.Text = "";
     }
     else
     {
       MessageBox.Show("请首先打开端口!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
       button4.Focus();
     }
   }
   //清屏
   private void button1_Click(object sender, EventArgs e)
   {
     rtbContent.Clear();
   }
   //退出
   private void button3_Click(object sender, EventArgs e)
   {
     Application.Exit();
   }
   //按<Ctrl+Enter>组合键发送信息
   private void rtbSend_KeyDown(object sender, KeyEventArgs e)
   {
     //当同时按下Ctrl和Enter时,发送消息
     if (e.Control && e.KeyValue == 13)
     {
       e.Handled = true;
       button2_Click(this, null);
     }
   }
   //聊天记录随时滚动
   private void rtbContent_TextChanged(object sender, EventArgs e)
   {
     rtbContent.ScrollToCaret();
   }
   private static byte[] Keys = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };//密钥
   #region DES加密字符串
   ///<summary>  
   ///DES加密字符串  
   ///</summary>  
   ///<param name="str">待加密的字符串</param>  
   ///<param name="key">加密密钥,要求为8位</param>  
   ///<returns>加密成功返回加密后的字符串,失败返回源字符串</returns>  
   public string EncryptDES(string str, string key)
   {
     try
     {
       byte[] rgbKey = Encoding.UTF8.GetBytes(key.Substring(0, 8));
       byte[] rgbIV = Keys;
       byte[] inputByteArray = Encoding.UTF8.GetBytes(str);
       DESCryptoServiceProvider myDES = new DESCryptoServiceProvider();
       MemoryStream MStream = new MemoryStream();
       CryptoStream CStream = new CryptoStream(MStream, myDES.CreateEncryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
       CStream.Write(inputByteArray, 0, inputByteArray.Length);
       CStream.FlushFinalBlock();
       return Convert.ToBase64String(MStream.ToArray());
     }
     catch
     {
       return str;
     }
   }
   #endregion
   #region DES解密字符串
   ///<summary>  
   ///DES解密字符串  
   ///</summary>  
   ///<param name="str">待解密的字符串</param>  
   ///<param name="key">解密密钥,要求为8位,和加密密钥相同</param>  
   ///<returns>解密成功返回解密后的字符串,失败返源字符串</returns>  
   public string DecryptDES(string str, string key)
   {
     try
     {
       byte[] rgbKey = Encoding.UTF8.GetBytes(key);
       byte[] rgbIV = Keys;
       byte[] inputByteArray = Convert.FromBase64String(str);
       DESCryptoServiceProvider myDES = new DESCryptoServiceProvider();
       MemoryStream MStream = new MemoryStream();
       CryptoStream CStream = new CryptoStream(MStream, myDES.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
       CStream.Write(inputByteArray, 0, inputByteArray.Length);
       CStream.FlushFinalBlock();
       return Encoding.UTF8.GetString(MStream.ToArray());
     }
     catch
     {
       return str;
     }
   }
   #endregion
 }
}

本例备有详细的注释,对于开发者而言应该不难理解,读者可以根据自身项目需要改进本例代码以符合自身应用需求。

标签:C#,数据包,加密,解密
0
投稿

猜你喜欢

  • java的url方式、本地方式获取json文件内容

    2023-08-22 18:30:23
  • Java遍历json字符串取值的实例

    2023-09-02 17:03:17
  • Android实现手机震动效果

    2022-11-05 12:20:43
  • Ubuntu中为Android实现Application Frameworks层增加硬件访问服务

    2021-05-28 14:20:02
  • Java数据结构之AC自动机算法的实现

    2023-08-31 07:23:57
  • Java获取文件夹下所有文件名称的方法示例

    2023-08-08 08:01:26
  • Java volatile如何实现禁止指令重排

    2022-01-13 18:29:24
  • Java @Value("${xxx}")取properties时中文乱码的解决

    2023-08-14 06:25:50
  • c#中的扩展方法学习笔记

    2023-04-11 10:29:15
  • Java webservice的POST和GET请求调用方式

    2023-01-10 05:35:43
  • 在IntelliJ IDEA中多线程并发代码的调试方法详解

    2022-01-09 03:05:45
  • Android读取资源文件的方法

    2022-09-25 22:11:53
  • C#并发编程入门教程之概述

    2022-08-08 09:44:23
  • Android高仿微信对话列表滑动删除效果

    2022-10-29 21:12:43
  • Android获取设备传感器的方法

    2022-10-07 10:50:16
  • OPENCV+JAVA实现人脸识别

    2022-03-15 18:31:39
  • WPF模拟实现Gitee泡泡菜单的示例代码

    2023-09-19 00:53:16
  • 采用C#实现软件自动更新的方法

    2021-12-30 19:13:38
  • C#泛型与非泛型性能比较的实例

    2022-01-31 17:26:51
  • 浅谈Service Manager成为Android进程间通信(IPC)机制Binder守护进程之路

    2021-09-04 05:48:21
  • asp之家 软件编程 m.aspxhome.com