目录
一、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.生成效果