C#實(shí)現(xiàn)數(shù)據(jù)包加密與解密實(shí)例詳解
在很多項(xiàng)目中,為了安全安全考慮,需要對(duì)數(shù)據(jù)包進(jìn)行加密處理,本文實(shí)例所述的即為C#加密代碼,在應(yīng)用開(kāi)發(fā)中有很大的實(shí)用價(jià)值。說(shuō)起數(shù)據(jù)包加密,其實(shí)對(duì)C#編程者來(lái)說(shuō),應(yīng)該是一個(gè)基礎(chǔ)的技巧,是進(jìn)行C#程序設(shè)計(jì)人員必須要掌握的技能。
C#實(shí)現(xiàn)加密功能的核心代碼如下:
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 定義全局對(duì)象及變量
private IPEndPoint Server;//服務(wù)器端
private IPEndPoint Client;//客戶端
private Socket mySocket;//套接字
private EndPoint ClientIP;//IP地址
byte[] buffer, data;//接收緩存
bool blFlag = true;//標(biāo)識(shí)是否第一次發(fā)送信息
bool ISPort = false;//判斷端口打開(kāi)
int SendNum1, ReceiveNum1, DisNum1; //記錄窗體加載時(shí)的已發(fā)送\已接收\(chéng)丟失的數(shù)據(jù)報(bào)
int SendNum2, ReceiveNum2, DisNum2; //記錄當(dāng)前已發(fā)送\已接收\(chéng)丟失的數(shù)據(jù)報(bào)
int SendNum3, ReceiveNum3, DisNum3; //緩存已發(fā)送\已接收\(chéng)丟失的數(shù)據(jù)報(bào)
int port;//端口號(hào)
#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"));//對(duì)接收到的信息進(jìn)行解密
rtbContent.AppendText("\r\n");
mySocket.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref ClientIP, new AsyncCallback(StartLister), null);
}
//初始化已發(fā)送、已接收和丟失的數(shù)據(jù)報(bào)
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());
}
}
//設(shè)置端口號(hào)
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;//打開(kāi)指定端口號(hào)
}
catch { }
}
//發(fā)送信息
private void button2_Click(object sender, EventArgs e)
{
if (ISPort == true)//判斷是否有打開(kāi)的端口號(hào)
{
IPGlobalProperties NetInfo = IPGlobalProperties.GetIPGlobalProperties();
UdpStatistics myUdpStat = null;
myUdpStat = NetInfo.GetUdpIPv4Statistics();
try
{
if (blFlag == false)//非第一次發(fā)送
{
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; //記錄本次的發(fā)送數(shù)據(jù)報(bào)
ReceiveNum3 = ReceiveNum2;//記錄本次的接收數(shù)據(jù)報(bào)
DisNum3 = DisNum2; //記錄本次的丟失數(shù)據(jù)報(bào)
if (blFlag == true)//第一次發(fā)送
{
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");//加密要發(fā)送的信息
data = Encoding.Unicode.GetBytes(str);
mySocket.SendTo(data, data.Length, SocketFlags.None, Client);
rtbSend.Text = "";
}
else
{
MessageBox.Show("請(qǐng)首先打開(kāi)端口!", "提示", 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>組合鍵發(fā)送信息
private void rtbSend_KeyDown(object sender, KeyEventArgs e)
{
//當(dāng)同時(shí)按下Ctrl和Enter時(shí),發(fā)送消息
if (e.Control && e.KeyValue == 13)
{
e.Handled = true;
button2_Click(this, null);
}
}
//聊天記錄隨時(shí)滾動(dòng)
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
}
}
本例備有詳細(xì)的注釋,對(duì)于開(kāi)發(fā)者而言應(yīng)該不難理解,讀者可以根據(jù)自身項(xiàng)目需要改進(jìn)本例代碼以符合自身應(yīng)用需求。
相關(guān)文章
C# 獲取指定QQ頭像繪制圓形頭像框GDI(Graphics)的方法
某論壇的評(píng)論區(qū)模塊,發(fā)現(xiàn)這功能很不錯(cuò),琢磨了一晚上做了大致一樣的,用來(lái)當(dāng)做 注冊(cè)模塊 的頭像綁定功能,下面通過(guò)實(shí)例代碼給大家介紹下C# 獲取指定QQ頭像繪制圓形頭像框GDI(Graphics)的方法,感興趣的朋友一起看看吧2021-11-11
c#調(diào)整圖片分辨率的實(shí)現(xiàn)示例
本文主要介紹了c#調(diào)整圖片分辨率的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-10-10
C#連接MySQL數(shù)據(jù)庫(kù)的方法步驟
最近兩天在解決C#連接MySql數(shù)據(jù)庫(kù)的問(wèn)題,通過(guò)不同的從網(wǎng)上學(xué)習(xí),最終找到了解決的辦法,下面這篇文章主要給大家介紹了關(guān)于C#連接MySQL數(shù)據(jù)庫(kù)的方法步驟,需要的朋友可以參考下2023-01-01
WinForm實(shí)現(xiàn)移除控件某個(gè)事件的方法
這篇文章主要介紹了WinForm實(shí)現(xiàn)移除控件某個(gè)事件的方法,對(duì)C#初學(xué)者有一定的借鑒價(jià)值,需要的朋友可以參考下2014-08-08

