c#实现MD5、DES、RSA加密解功能

493 阅读4分钟

一、MD5不可逆加密

源码如下:

    /// <summary>
    /// MD5不可逆加密
    /// 1 防止被篡改
    /// 2 防止明文存储
    /// 3 防止抵赖,数字签名
    /// </summary>
    /// <param name="data">要加密的文本</param>
    /// <param name="encryptEnum">加密成功后密文的长度</param>
    /// <returns>加密之后的文本</returns>
    public static string MD5Encrypt(string data, EncryptEnum encryptEnum = EncryptEnum.Default)
    {
        if (string.IsNullOrEmpty(data)) return null;

        //创建MD5新实例
        MD5 md5 = MD5.Create();
        //选择UTF8编码格式=>把需要加密的文本转成二进制
        byte[] bytes = Encoding.UTF8.GetBytes(data);
        //把二进制数据转成哈希码
        byte[] hashValue = md5.ComputeHash(bytes);

        string result = string.Empty;
        int max = 0, min = 0;
        switch (encryptEnum)
        {
            case EncryptEnum.Default://c#系统默认加密长度就是32位
            case EncryptEnum.ThirtyTwo://32位加密长度
                max = 16;
                //max = hashValue.Length;
                break;
            case EncryptEnum.Sixteen://16位密文是32位密文的9到24位字符
                max = 12;
                min = 4;
                break;
        }
        for (int i = min; i < max; i++)
        {
            result += hashValue[i].ToString("x2");
        }
        return result;
    }

我在这里封装了一个可供用户选择加密长度的枚举,用来计算加密之后密文文本长度使用的,当然,这是一个可控参数,用户不输入,则默认位c#系统默认MD5加密长度32位

   public enum EncryptEnum
    {
        /// <summary>
        /// 系统默认加密
        /// </summary>
        Default = 0,
        /// <summary>
        /// 16位加密
        /// </summary>
        Sixteen = 16,
        /// <summary>
        /// 三十二位加密
        /// </summary>
        ThirtyTwo = 32
    }
    
    

二、DES可逆、对称加密

DES加密必须要指定他的公开的加密Key和IV,我在代码上方定义了一个通过字符串转成的Key和IV,这个字符串大家可以随便填写。

源码如下:

    /// <summary>
    /// DES AES Blowfish
    ///  对称加密算法的优点是速度快,
    ///  缺点是密钥管理不方便,要求共享密钥。
    /// 可逆对称加密  密钥长度8
    /// </summary>
    //二进制 key, iv
    private static byte[] byteKey = Encoding.ASCII.GetBytes("12345678");
    private static byte[] byteIV = Encoding.ASCII.GetBytes("87654321");

    /// <summary>
    /// DES可逆 对称加密
    /// </summary>
    /// <param name="data">要加密的文本</param>
    /// <returns>64进制字符串</returns>
    public static string DESEncrypt(string data)
    {
        //DES加密实例化
        DESCryptoServiceProvider desp = new DESCryptoServiceProvider();
        using (MemoryStream ms = new MemoryStream())//创建内存流
        {
            //把数据流 => 加密流
            //CreateEncryptor方法是DES官方加密算法
            CryptoStream cs = new CryptoStream(ms, desp.CreateEncryptor(byteKey, byteIV), CryptoStreamMode.Write);
            //实例化写入流
            StreamWriter sw = new StreamWriter(cs);
            sw.Write(data);//向流中写入需要加密的数据
            sw.Flush();//关闭写入器
            cs.FlushFinalBlock(); //关闭转换流
            ms.Flush();//关闭内存流
            return Convert.ToBase64String(ms.GetBuffer(), 0, (int)ms.Length);
        }
    }

    /// <summary>
    /// DES 可逆 对称解密
    /// </summary>
    /// <param name="data">需要解密的64进制字符串</param>
    /// <returns>解析后的字符串</returns>
    public static string DESDecrypt(string data)
    {
        //DES加密实例化
        using (DESCryptoServiceProvider desp = new DESCryptoServiceProvider())
        {
            //把64进制字符串 => 二进制流
            byte[] buffer = Convert.FromBase64String(data);
            using (MemoryStream ms = new MemoryStream())
            {
                //把加密流 => 数据流
                //CreateDecryptor方法是DES官方解密算法
                CryptoStream cs = new CryptoStream(ms, desp.CreateDecryptor(byteKey, byteIV), CryptoStreamMode.Write);
                cs.Write(buffer, 0, buffer.Length);//向流中写入要解析的数据
                cs.FlushFinalBlock();//关闭转换流
                return Encoding.UTF8.GetString(ms.ToArray());
            }
        }
    }
    
  

三、RSA可逆、非对称加密

RSA加密,必须要使用xml信息的公钥和私钥才能对其进行加密解密操作,所以也在代码上方封住了一个获取公钥私钥的方法,大家可以参考以下代码。

源码如下

    /**
    * RSA ECC
    * 可逆非对称加密
    * 非对称加密算法的优点是密钥管理很方便,缺点是速度慢。
    * */

    /// <summary>
    /// 获取RSA加密解密的公钥和私钥
    /// </summary>
    /// <returns></returns>
    public static Dictionary<string, string> GetPublicAndPrivateKey()
    {
        RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
        string publicKey = rsa.ToXmlString(false);//包含RSA公钥信息的字符串
        string privateKey = rsa.ToXmlString(true);//包含RSA公钥和私钥信息的字符串

        return new Dictionary<string, string>
        {
            { publicKey, privateKey }
        };
    }

    /// <summary>
    /// RSA 可逆 非对称加密
    /// </summary>
    /// <param name="data">要加密的文本</param>
    /// <param name="publicKey">必须是包含xml信息的加密使用的公钥</param>
    /// <returns>64进制加密之后的字符串文本</returns>
    public static string RSAEncrypt(string data, string publicKey)
    {
        //实例化RSA加密流
        RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
        rsa.FromXmlString(publicKey);//解析xml公钥信息
        UnicodeEncoding ue = new UnicodeEncoding();//utf-16编码格式
        byte[] bytes = ue.GetBytes(data);//把文本 => 二进制
        //对文本二进制进行加密,false 不适用默认填充文本
        byte[] resultBytes = rsa.Encrypt(bytes, false);
        return Convert.ToBase64String(resultBytes);
    }

    /// <summary>
    /// RSA 可逆 非对称解密
    /// </summary>
    /// <param name="data">要解密64进制的文本</param>
    /// <param name="privateKey">必须是包含xml信息的解密使用的私钥</param>
    /// <returns>解析成功的文本</returns>
    public static string RSADecrypt(string data, string privateKey)
    {
        //把64进制字符串转成二进制流
        byte[] bytes = Convert.FromBase64String(data);
        //实例化RSA加密流
        RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
        rsa.FromXmlString(privateKey);//解析xml私钥信息
        byte[] resultBytes = rsa.Decrypt(bytes, false);
        UnicodeEncoding ue = new UnicodeEncoding();//utf-16编码格式 
        return ue.GetString(resultBytes);
    }

四、MD5、DES、RSA,加密\解密调用

简单示例:如图,我定义了一个接口,让他在控制台打印加密解密的数据 image.png

image.png 如上图所示:跟我们预料的结果一样,加密解密非常成功。

今天的MD5、DES、RSA加密解功能到这里就分享完毕了,大家有什么更加好用的加密解密方法欢迎来评论区讨论!!!