C#自定义加解密

4 篇文章 0 订阅
1 篇文章 0 订阅

加解密算法

加解密算法要求具有要可逆性。
如果使用相同的密钥进行加密和解密,则称为对称加密。
本文实现的是对称加密的实例,实现的实例虽然没有高安全性,但是胜在简洁,在一些不需要太高安全等级的场景下,具有便捷可用的特点。可以在非安全数据加密场景使用。也可以当作一个小项目,训练以下自己的编程基础。

代码结构

在这里插入图片描述

代码实现

添加一个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}");

结果如下:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值