加解密算法
加解密算法要求具有要可逆性。
如果使用相同的密钥进行加密和解密,则称为对称加密。
本文实现的是对称加密的实例,实现的实例虽然没有高安全性,但是胜在简洁,在一些不需要太高安全等级的场景下,具有便捷可用的特点。可以在非安全数据加密场景使用。也可以当作一个小项目,训练以下自己的编程基础。
代码结构
代码实现
添加一个C#项目,项目内新建一个文件夹crypt,在文件夹内 新建2个文件ICryptHelper.cs和CryptHelper.cs。
ICryptHelper文件:用于定义接口和对象生成类。
CryptHelper文件:类文件,实现了接口。
文件内自定义为crypt命名空间。
1.定义接口
ICryptHelper.cs:
namespace crypt
{
/// <summary>
/// 使用MD5加解密
/// </summary>
public interface ICryptHelper
{
/// <summary>
/// 加密
/// </summary>
/// <param name="value">明文</param>
/// <param name="key">密钥 8位数字</param>
/// <returns>密文</returns>
string Encrypt(string value, string key);
/// <summary>
/// 解密
/// </summary>
/// <param name="value">密文</param>
/// <param name="key">密钥 8位数字</param>
/// <returns>明文</returns>
string Decrypt(string value, string key);
}
public class Maker
{
public static ICryptHelper NewMD5Helper()
{
return new CryptHelper();
}
}
}
2.实现接口
CryptHelper.cs:
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
namespace crypt
{
internal class CryptHelper : ICryptHelper
{
private string Run(Func<DESCryptoServiceProvider, string> func)
{
try
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
return func(des);
}
catch { return ""; }
}
public string Encrypt(string value, string key)
{
return Run(des =>
{
byte[] inputByteArray = Encoding.Default.GetBytes(value);
des.Key = ASCIIEncoding.ASCII.GetBytes(key);
des.IV = ASCIIEncoding.ASCII.GetBytes(key);
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
StringBuilder ret = new StringBuilder();
foreach (byte b in ms.ToArray())
{
ret.AppendFormat("{0:X2}", b);
}
return ret.ToString();
});
}
public string Decrypt(string value, string key)
{
return Run(des =>
{
byte[] inputByteArray = new byte[value.Length / 2];
for (int x = 0; x < value.Length / 2; x++)
{
int i = (Convert.ToInt32(value.Substring(x * 2, 2), 16));
inputByteArray[x] = (byte)i;
}
des.Key = ASCIIEncoding.ASCII.GetBytes(key);
des.IV = ASCIIEncoding.ASCII.GetBytes(key);
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
StringBuilder ret = new StringBuilder();
return System.Text.Encoding.Default.GetString(ms.ToArray());
});
}
}
}
3.定义生成器
在ICryptHelper.cs文件中,定义了类Maker,其有一个静态函数NewMD5Helper,用于返回一个实现了ICryptHelper接口的实例。在后续的使用中,外界只使用Maker进行接口调用,实现高内聚低耦合的接口编程。
使用加解密
var md5 = crypt.Maker.NewMD5Helper();
var cry = md5.Encrypt("abc.123","20220731");
Console.WriteLine($"cipher:{cry}");
var txt = md5.Decrypt(cry,"20220731");
Console.WriteLine($"text:{txt}");
结果如下: