目录
一、CrytoStream的加密方法
二、CrytoStream的解密方法
三、实例
1.源码Form1.cs
2.类库Encrypt.cs
3.生成效果
在使用CryptoStream前要先引用命名空间using System.Security.Cryptography。
一、CrytoStream的加密方法
记住,不能再使用DESCryptoServiceProvider().CreateEncryptor()创建加密流,因为它已经被微软废弃了。会提示“SYSLIB0021:派生加密类型已过时”,编译也过不去。
SYSLIB0021 警告 - .NET | Microsoft Learn
https://learn.microsoft.com/zh-cn/dotnet/fundamentals/syslib-diagnostics/syslib0021
解决办法:把DESCryptoServiceProvider().CreateEncryptor()替换为DES.Create()。
internal static string ToEncrypt(string encryptKey, string str)
{try{byte[] byte_key = Encoding.Unicode.GetBytes(encryptKey); //将密钥字符串转换为字节序列byte[] byte_data = Encoding.Unicode.GetBytes(str); //将字符串转换为字节序列 using var des = DES.Create(); //创建加密流对象using var memory_stream = new MemoryStream(); //创建内存流对象using var crypto_stream = new CryptoStream(memory_stream, des.CreateEncryptor(byte_key, byte_key), CryptoStreamMode.Write); //创建加密流对象crypto_stream.Write(byte_data, 0, byte_data.Length); //向加密流中写入字节序列crypto_stream.FlushFinalBlock(); //将数据压入基础流crypto_stream.Close(); //关闭加密流memory_stream.Close(); //关闭内存流return Convert.ToBase64String(memory_stream.ToArray()); //从内存流中获取并返回加密后的字符串}catch (CryptographicException ce){throw new Exception(ce.Message);}
}
二、CrytoStream的解密方法
与加密方法具有相同的注意事项。
internal static string ToDecrypt(string encryptKey, string str)
{try{byte[] byte_key = Encoding.Unicode.GetBytes(encryptKey); //将密钥字符串转换为字节序列byte[] byte_data = Convert.FromBase64String(str); //将加密后的字符串转换为字节序列using var des = DES.Create(); //创建加密流对象using var memory_stream = new MemoryStream(byte_data); //创建内存流对象并写入数据using var crypto_stream = new CryptoStream(memory_stream, des.CreateDecryptor(byte_key, byte_key), CryptoStreamMode.Read); //创建加密流对象byte[] bt_temp = new byte[200]; //创建字节序列对象MemoryStream memory_stream_temp = new(); //创建内存流对象int i = 0; //创建记数器while ((i = crypto_stream.Read(bt_temp, 0, bt_temp.Length)) > 0) //使用while循环得到解密数据{memory_stream_temp.Write(bt_temp, 0, i); //将解密后的数据放入内存流}crypto_stream.Close(); //关闭加密流memory_stream.Close(); //关闭内存流return Encoding.Unicode.GetString(memory_stream_temp.ToArray()); //方法返回解密后的字符串}catch (CryptographicException ce){throw new Exception(ce.Message);}
}
三、实例
对字符串加密、解密的实例,秘钥=4位数字。
1.源码Form1.cs
// 使用CryptoStream类加密和解密字符串
namespace _046
{public partial class Form1 : Form{private GroupBox? groupBox1;private GroupBox? groupBox2;private Button? button1;private TextBox? textBox3;private TextBox? textBox2;private TextBox? textBox1;private Label? label3;private Label? label2;private Label? label1;private Button? button2;private TextBox? textBox6;private Label? label4;private Label? label5;private Label? label6;private TextBox? textBox4;private TextBox? textBox5;public Form1(){InitializeComponent();Load += Form1_Load;}private void Form1_Load(object? sender, EventArgs e){// // button1// button1 = new Button{Location = new Point(369, 89),Name = "button1",Size = new Size(75, 23),TabIndex = 6,Text = "加密",UseVisualStyleBackColor = true};button1.Click += Button1_Click;// // textBox3// textBox3 = new TextBox{Location = new Point(12, 136),Multiline = true,Name = "textBox3",Size = new Size(432, 46),TabIndex = 5};// // textBox2// textBox2 = new TextBox{Location = new Point(119, 89),Name = "textBox2",Size = new Size(244, 23),TabIndex = 4};// // textBox1// textBox1 = new TextBox{Location = new Point(11, 41),Multiline = true,Name = "textBox1",Size = new Size(433, 46),TabIndex = 3};// // label3// label3 = new Label{AutoSize = true,Location = new Point(11, 114),Name = "label3",Size = new Size(92, 17),TabIndex = 2,Text = "加密后字符串:"};// // label2// label2 = new Label{AutoSize = true,Location = new Point(11, 92),Name = "label2",Size = new Size(81, 17),TabIndex = 1,Text = "4bit加密秘钥:"};// // label1// label1 = new Label{AutoSize = true,Location = new Point(11, 19),Name = "label1",Size = new Size(92, 17),TabIndex = 0,Text = "加密前字符串:"};// // groupBox1// groupBox1 = new GroupBox{Location = new Point(12, 12),Name = "groupBox1",Size = new Size(450, 188),TabIndex = 0,TabStop = false,Text = "加密"};groupBox1.Controls.Add(button1);groupBox1.Controls.Add(textBox3);groupBox1.Controls.Add(textBox2);groupBox1.Controls.Add(textBox1);groupBox1.Controls.Add(label3);groupBox1.Controls.Add(label2);groupBox1.Controls.Add(label1);groupBox1.SuspendLayout();// // button2//button2 = new Button{Location = new Point(369, 89),Name = "button2",Size = new Size(75, 23),TabIndex = 13,Text = "解密",UseVisualStyleBackColor = true};button2.Click += Button2_Click;// // textBox6// textBox6 = new TextBox{Location = new Point(12, 136),Multiline = true,Name = "textBox6",Size = new Size(433, 46),TabIndex = 12};// // label4// label4 = new Label{AutoSize = true,Location = new Point(12, 19),Name = "label4",Size = new Size(92, 17),TabIndex = 7,Text = "解密前字符串:"};// // label5// label5 = new Label{AutoSize = true,Location = new Point(12, 92),Name = "label5",Size = new Size(90, 17),TabIndex = 8,Text = "4bit解密密钥:"};// // label6// label6 = new Label{AutoSize = true,Location = new Point(12, 114),Name = "label6",Size = new Size(92, 17),TabIndex = 9,Text = "解密后字符串:"};// // textBox4// textBox4 = new TextBox{Location = new Point(12, 41),Multiline = true,Name = "textBox4",Size = new Size(432, 46),TabIndex = 10};// // textBox5// textBox5 = new TextBox{Location = new Point(119, 89),Name = "textBox5",Size = new Size(244, 23),TabIndex = 11};// // groupBox2// groupBox2 = new GroupBox{Location = new Point(12, 206),Name = "groupBox2",Size = new Size(450, 188),TabIndex = 0,TabStop = false,Text = "解密"};groupBox2.Controls.Add(button2);groupBox2.Controls.Add(textBox6);groupBox2.Controls.Add(label4);groupBox2.Controls.Add(label5);groupBox2.Controls.Add(label6);groupBox2.Controls.Add(textBox4);groupBox2.Controls.Add(textBox5);groupBox2.SuspendLayout();// // Form1// AutoScaleDimensions = new SizeF(7F, 17F);AutoScaleMode = AutoScaleMode.Font;ClientSize = new Size(474, 406);Controls.Add(groupBox2);Controls.Add(groupBox1);Name = "Form1";StartPosition = FormStartPosition.CenterScreen;Text = "用CryptoStream类加密和解密字符串";groupBox1.ResumeLayout(false);groupBox1.PerformLayout();groupBox2.ResumeLayout(false);groupBox2.PerformLayout();ResumeLayout(false);}private void Button1_Click(object? sender, EventArgs e){if (textBox2!.Text.Length == 4) //判断加密密钥长度是否正确{try{textBox3!.Text = //调用实例ToEncrypt方法得到加密后的字符串Encrypt.ToEncrypt(textBox2.Text, textBox1!.Text);}catch (Exception ex) //捕获异常{MessageBox.Show(ex.Message);//输出异常信息}}else{MessageBox.Show("密钥长度不符!", "提示");//提示用户输入密钥长度不正确}}private void Button2_Click(object? sender, EventArgs e){if (textBox5!.Text.Length == 4) //判断加密密钥长度是否正确{try{textBox6!.Text = //调用ToDecrypt方法得到解密后的字符串Encrypt.ToDecrypt(textBox5.Text, textBox4!.Text);}catch (Exception ex) //捕获异常{MessageBox.Show(ex.Message); //输出异常信息}}else{MessageBox.Show("密钥长度不符!", "提示");//提示用户输入密钥长度不正确}}}
}
2.类库Encrypt.cs
using System.Security.Cryptography;
using System.Text;namespace _046
{internal class Encrypt{internal static string ToEncrypt(string encryptKey, string str){try{byte[] byte_key = Encoding.Unicode.GetBytes(encryptKey);//将密钥字符串转换为字节序列byte[] byte_data = Encoding.Unicode.GetBytes(str); //将字符串转换为字节序列 using var des = DES.Create(); //创建加密流对象 using var memory_stream = new MemoryStream(); //创建内存流对象using var crypto_stream = new CryptoStream(memory_stream, des.CreateEncryptor(byte_key, byte_key), CryptoStreamMode.Write); //创建加密流对象crypto_stream.Write(byte_data, 0, byte_data.Length); //向加密流中写入字节序列crypto_stream.FlushFinalBlock(); //将数据压入基础流 crypto_stream.Close(); //关闭加密流 memory_stream.Close(); //关闭内存流 return Convert.ToBase64String(memory_stream.ToArray()); //从内存流中获取并返回加密后的字符串}catch (CryptographicException ce){throw new Exception(ce.Message);}}internal static string ToDecrypt(string encryptKey, string str){try{byte[] byte_key = Encoding.Unicode.GetBytes(encryptKey); //将密钥字符串转换为字节序列 byte[] byte_data = Convert.FromBase64String(str); //将加密后的字符串转换为字节序列 using var des = DES.Create(); //创建加密流对象 using var memory_stream = new MemoryStream(byte_data); //创建内存流对象并写入数据 using var crypto_stream = new CryptoStream(memory_stream, des.CreateDecryptor(byte_key, byte_key), CryptoStreamMode.Read);//创建加密流对象 byte[] bt_temp = new byte[200]; //创建字节序列对象 MemoryStream memory_stream_temp = new(); //创建内存流对象 int i = 0; //创建记数器 while ((i = crypto_stream.Read(bt_temp, 0, bt_temp.Length)) > 0)//使用while循环得到解密数据 {memory_stream_temp.Write(bt_temp, 0, i);//将解密后的数据放入内存流 }crypto_stream.Close(); //关闭加密流 memory_stream.Close(); //关闭内存流 return Encoding.Unicode.GetString(memory_stream_temp.ToArray());//方法返回解密后的字符串}catch (CryptographicException ce){throw new Exception(ce.Message);}}}
}
3.生成效果