C#开发中经常用的加密解密方法示例

 更新时间:2020年6月25日 10:36  点击:2323

前言

相信很多人在开发过程中经常会遇到需要对一些重要的信息进行加密处理,今天给大家分享我个人总结的一些加密算法:

常见的加密方式分为可逆和不可逆两种方式

    可逆:RSA,AES,DES等

    不可逆:常见的MD5,SHAD等

一、MD5消息摘要算法

我想这是大家都常听过的算法,可能也用的比较多。那么什么是MD5算法呢?MD5全称是message-digest algorithm 5,简单的说就是单向的加密,也就是说无法根据密文推导出明文。

MD5主要用途:

1、对一段信息生成信息摘要,该摘要对该信息具有唯一性,可以作为数字签名

2、用于验证文件的有效性(是否有丢失或损坏的数据)

3、对用户密码的加密

4、在哈希函数中计算散列值

从上边的主要用途中我们看到,由于算法的某些不可逆特征,在加密应用上有较好的安全性。通过使用MD5加密算法,我们输入一个任意长度的字节串,都会生成一个128位的整数。所以根据这一点MD5被广泛的用作密码加密。下面我就像大家演示一下怎样进行密码加密。

首先需要引入命名空间,先看一个比较简单的MD5加密的例子:

using System.Security;

using System.Security.Cryptography;

public string ToMD5(string strs) 
{
      MD5 md5 = new MD5CryptoServiceProvider();
      byte[] bytes = Encoding.Default.GetBytes(strs);//将要加密的字符串转换为字节数组
      byte[] encryptdata = md5.ComputeHash(bytes);//将字符串加密后也转换为字符数组
      return Convert.ToBase64String(encryptdata);//将加密后的字节数组转换为加密字符串
 }

这里我们需要注意的是,不论是在加密的过程中,加密前要将加密字符串转为字节数组,加密后也要生成密文的字节数据,然后再转化为密文。

下面是关于MD5加密的其他形式,可以根据需求编写你们自己需要的加密算法:

/// <summary>
    /// 创建哈希字符串适用于任何 MD5 哈希函数 (在任何平台) 上创建 32 个字符的十六进制格式哈希字符串
    /// </summary>
    /// <param name="source"></param>
    /// <returns></returns>
    public static string Get32MD5One(string source)
    {
      using (System.Security.Cryptography.MD5 md5Hash = System.Security.Cryptography.MD5.Create())
      {
        byte[] data = md5Hash.ComputeHash(System.Text.Encoding.UTF8.GetBytes(source));
        System.Text.StringBuilder sBuilder = new System.Text.StringBuilder();
        for (int i = 0; i < data.Length; i++)
        {
          sBuilder.Append(data[i].ToString("x2"));
        }

        string hash = sBuilder.ToString();
        return hash.ToUpper();
      }
    }

    /// <summary>
    /// 获取16位md5加密
    /// </summary>
    /// <param name="source"></param>
    /// <returns></returns>
    public static string Get16MD5One(string source)
    {
      using (System.Security.Cryptography.MD5 md5Hash = System.Security.Cryptography.MD5.Create())
      {
        byte[] data = md5Hash.ComputeHash(System.Text.Encoding.UTF8.GetBytes(source));
        //转换成字符串,并取9到25位
        string sBuilder = BitConverter.ToString(data, 4, 8);
        //BitConverter转换出来的字符串会在每个字符中间产生一个分隔符,需要去除掉
        sBuilder = sBuilder.Replace("-", "");
        return sBuilder.ToString().ToUpper();
      }
    }

    //// <summary>
    /// </summary>
    /// <param name="strSource">需要加密的明文</param>
    /// <returns>返回32位加密结果,该结果取32位加密结果的第9位到25位</returns>
    public static string Get32MD5Two(string source)
    {
      System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
      //获取密文字节数组
      byte[] bytResult = md5.ComputeHash(System.Text.Encoding.Default.GetBytes(source));
      //转换成字符串,32位
      string strResult = BitConverter.ToString(bytResult);
      //BitConverter转换出来的字符串会在每个字符中间产生一个分隔符,需要去除掉
      strResult = strResult.Replace("-", "");
      return strResult.ToUpper();
    }

    //// <summary>
    /// </summary>
    /// <param name="strSource">需要加密的明文</param>
    /// <returns>返回16位加密结果,该结果取32位加密结果的第9位到25位</returns>
    public static string Get16MD5Two(string source)
    {
      System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
      //获取密文字节数组
      byte[] bytResult = md5.ComputeHash(System.Text.Encoding.Default.GetBytes(source));
      //转换成字符串,并取9到25位
      string strResult = BitConverter.ToString(bytResult, 4, 8);
      //BitConverter转换出来的字符串会在每个字符中间产生一个分隔符,需要去除掉
      strResult = strResult.Replace("-", "");
      return strResult.ToUpper();
    }

二、DES加密

DES加密算法为密码体制中的对称密码体制,又被称为美国数据加密标准,是1972年美国IBM公司研制的对称密码体制加密算法。 明文按64位进行分组,密钥长64位,密钥事实上是56位参与DES运算(第8、16、24、32、40、48、56、64位是校验位, 使得每个密钥都有奇数个1)分组后的明文组和56位的密钥按位替代或交换的方法形成密文组的加密方法。

DES,全称Data Encryption Standard,是一种对称加密算法。由于其安全性比较高(有限时间内,没有一种加密方法可以说是100%安全),很可能是最广泛的密钥系统(我们公司也在用,估计你们也有在用....),唯一一种方法可以破解该算法,那就是穷举法。

/// <summary>
    /// DES加密
    /// </summary>
    /// <param name="data">加密数据</param>
    /// <param name="key">8位字符的密钥字符串</param>
    /// <param name="iv">8位字符的初始化向量字符串</param>
    /// <returns></returns>
    public static string DESEncrypt(string data, string key, string iv)
    {
      byte[] byKey = System.Text.ASCIIEncoding.ASCII.GetBytes(key);
      byte[] byIV = System.Text.ASCIIEncoding.ASCII.GetBytes(iv);

      DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider();
      int i = cryptoProvider.KeySize;
      MemoryStream ms = new MemoryStream();
      CryptoStream cst = new CryptoStream(ms, cryptoProvider.CreateEncryptor(byKey, byIV), CryptoStreamMode.Write);

      StreamWriter sw = new StreamWriter(cst);
      sw.Write(data);
      sw.Flush();
      cst.FlushFinalBlock();
      sw.Flush();
      return Convert.ToBase64String(ms.GetBuffer(), 0, (int)ms.Length);
    }

    /// <summary>
    /// DES解密
    /// </summary>
    /// <param name="data">解密数据</param>
    /// <param name="key">8位字符的密钥字符串(需要和加密时相同)</param>
    /// <param name="iv">8位字符的初始化向量字符串(需要和加密时相同)</param>
    /// <returns></returns>
    public static string DESDecrypt(string data, string key, string iv)
    {
      byte[] byKey = System.Text.ASCIIEncoding.ASCII.GetBytes(key);
      byte[] byIV = System.Text.ASCIIEncoding.ASCII.GetBytes(iv);

      byte[] byEnc;
      try
      {
        byEnc = Convert.FromBase64String(data);
      }
      catch
      {
        return null;
      }

      DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider();
      MemoryStream ms = new MemoryStream(byEnc);
      CryptoStream cst = new CryptoStream(ms, cryptoProvider.CreateDecryptor(byKey, byIV), CryptoStreamMode.Read);
      StreamReader sr = new StreamReader(cst);
      return sr.ReadToEnd();
    }

此外还有AES加密算法,但是AES加密是一个新的可以用于保护电子数据的加密算法。其产生的密码是迭代对称的分组密码,代加密使用一个循环结构,在该循环中重复置换和替换输入数据。

三、RSA加密算法

在谈RSA加密算法之前,我们需要先了解下两个专业名词,对称加密和非对称加密。

对称加密即:含有一个称为密钥的东西,在消息发送前使用密钥对消息进行加密,在对方收到消息之后,使用相同的密钥进行解密

非对称加密即:加密和解密使用不同的密钥的一类加密算法。这类加密算法通常有两个密钥A和B,使用密钥A加密数据得到的密文,只有密钥B可以进行解密操作(即使密钥A也无法解密),相反,使用了密钥B加密数据得到的密文,只有密钥A可以解密。这两个密钥分别称为私钥和公钥,顾名思义,私钥就是你个人保留,不能公开的密钥,而公钥则是公开给加解密操作的另一方的。根据不同用途,对数据进行加密所使用的密钥也不相同(有时用公钥加密,私钥解密;有时相反用私钥加密,公钥解密)。非对称加密的代表算法是RSA算法。

了解了这两个名词下面来讲,RSA加密算法。RSA取名来自开发他们三者的名字。RSA是目前最有影响力的公钥加密算法,多用于数据加密和数字签名。虽然有这么大的影响力,但是同时它也有一些弊端,它产生密钥很麻烦,受到素数产生技术的限制,因而难以做到一次一密,分组长度太大等。

下面通过示例演示使用RSA加密、解密,引用名称空间System.Security.Cryptography;

/// <summary> 
    /// RSA加密数据 
    /// </summary> 
    /// <param name="express">要加密数据</param> 
    /// <param name="KeyContainerName">密匙容器的名称</param> 
    /// <returns></returns> 
    public static string RSAEncryption(string express, string KeyContainerName = null)
    {

      System.Security.Cryptography.CspParameters param = new System.Security.Cryptography.CspParameters();
      param.KeyContainerName = KeyContainerName ?? "zhiqiang"; //密匙容器的名称,保持加密解密一致才能解密成功
      using (System.Security.Cryptography.RSACryptoServiceProvider rsa = new System.Security.Cryptography.RSACryptoServiceProvider(param))
      {
        byte[] plaindata = System.Text.Encoding.Default.GetBytes(express);//将要加密的字符串转换为字节数组
        byte[] encryptdata = rsa.Encrypt(plaindata, false);//将加密后的字节数据转换为新的加密字节数组
        return Convert.ToBase64String(encryptdata);//将加密后的字节数组转换为字符串
      }
    }
    /// <summary> 
    /// RSA解密数据 
    /// </summary> 
    /// <param name="express">要解密数据</param> 
    /// <param name="KeyContainerName">密匙容器的名称</param> 
    /// <returns></returns> 
    public static string RSADecrypt(string ciphertext, string KeyContainerName = null)
    {
      System.Security.Cryptography.CspParameters param = new System.Security.Cryptography.CspParameters();
      param.KeyContainerName = KeyContainerName ?? "zhiqiang"; //密匙容器的名称,保持加密解密一致才能解密成功
      using (System.Security.Cryptography.RSACryptoServiceProvider rsa = new System.Security.Cryptography.RSACryptoServiceProvider(param))
      {
        byte[] encryptdata = Convert.FromBase64String(ciphertext);
        byte[] decryptdata = rsa.Decrypt(encryptdata, false);
        return System.Text.Encoding.Default.GetString(decryptdata);
      }
    }

四、Base64编码

这个就不做过多解释了,直接上代码。

#region Base64加密解密
    /// <summary>
    /// Base64加密
    /// </summary>
    /// <param name="input">需要加密的字符串</param>
    /// <returns></returns>
    public static string Base64Encrypt(string input)
    {
      return Base64Encrypt(input, new UTF8Encoding());
    }

    /// <summary>
    /// Base64加密
    /// </summary>
    /// <param name="input">需要加密的字符串</param>
    /// <param name="encode">字符编码</param>
    /// <returns></returns>
    public static string Base64Encrypt(string input, Encoding encode)
    {
      return Convert.ToBase64String(encode.GetBytes(input));
    }

    /// <summary>
    /// Base64解密
    /// </summary>
    /// <param name="input">需要解密的字符串</param>
    /// <returns></returns>
    public static string Base64Decrypt(string input)
    {
      return Base64Decrypt(input, new UTF8Encoding());
    }

    /// <summary>
    /// Base64解密
    /// </summary>
    /// <param name="input">需要解密的字符串</param>
    /// <param name="encode">字符的编码</param>
    /// <returns></returns>
    public static string Base64Decrypt(string input, Encoding encode)
    {
      return encode.GetString(Convert.FromBase64String(input));
    }
    #endregion

五、SHA安全散列算法

 SHA,全称SecureHashAlgorithm,是一种数据加密算法,该算法的思想是接收一段明文,然后以一种不可逆的方式将它转换成一段(通常更小)密文,也可以简单的理解为取一串输入码(称为预映射或信息),并把它们转化为长度较短、位数固定的输出序列即散列值(也称为信息摘要或信息认证代码)的过程。

下面贴SHA各种加密算法代码:

//SHA为不可逆加密方式
    public static string SHA1Encrypt(string Txt)
    {
      var bytes = System.Text.Encoding.Default.GetBytes(Txt);
      var SHA = new System.Security.Cryptography.SHA1CryptoServiceProvider();
      var encryptbytes = SHA.ComputeHash(bytes);
      return Convert.ToBase64String(encryptbytes);
    }
    public static string SHA256Encrypt(string Txt)
    {
      var bytes = System.Text.Encoding.Default.GetBytes(Txt);
      var SHA256 = new System.Security.Cryptography.SHA256CryptoServiceProvider();
      var encryptbytes = SHA256.ComputeHash(bytes);
      return Convert.ToBase64String(encryptbytes);
    }
    public static string SHA384Encrypt(string Txt)
    {
      var bytes = System.Text.Encoding.Default.GetBytes(Txt);
      var SHA384 = new System.Security.Cryptography.SHA384CryptoServiceProvider();
      var encryptbytes = SHA384.ComputeHash(bytes);
      return Convert.ToBase64String(encryptbytes);
    }
    public string SHA512Encrypt(string Txt)
    {
      var bytes = System.Text.Encoding.Default.GetBytes(Txt);
      var SHA512 = new System.Security.Cryptography.SHA512CryptoServiceProvider();
      var encryptbytes = SHA512.ComputeHash(bytes);
      return Convert.ToBase64String(encryptbytes);
    }

六、AES加密算法 

 AES算法基于排列和置换运算。排列是对数据重新进行安排,置换是将一个数据单元替换为另一个。

AES 使用几种不同的方法来执行排列和置换运算。    AES是一个迭代的、对称密钥分组的密码,它可以使用128、192 和 256 位密钥,并且用 128 位(16字节)分组加密和解密数据。与公共密钥密码使用密钥对不同,对称密钥密码使用相同的密钥加密和解密数据。通过分组密码返回的加密数据的位数与输入数据相同。迭代加密使用一个循环结构,在该循环中重复置换和替换输入数据。

/// <summary>
    /// AES 加密
    /// </summary>
    /// <param name="str">明文(待加密)</param>
    /// <param name="key">密文</param>
    /// <returns></returns>
    public string AesEncrypt(string str, string key)
    {
      if (string.IsNullOrEmpty(str)) return null;
      Byte[] toEncryptArray = Encoding.UTF8.GetBytes(str);
 
      RijndaelManaged rm = new RijndaelManaged
      {
        Key = Encoding.UTF8.GetBytes(key),
        Mode = CipherMode.ECB,
        Padding = PaddingMode.PKCS7
      };
 
      ICryptoTransform cTransform = rm.CreateEncryptor();
      Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
      return Convert.ToBase64String(resultArray);
    }
 
    /// <summary>
    /// AES 解密
    /// </summary>
    /// <param name="str">明文(待解密)</param>
    /// <param name="key">密文</param>
    /// <returns></returns>
    public string AesDecrypt(string str, string key)
    {
      if (string.IsNullOrEmpty(str)) return null;
      Byte[] toEncryptArray = Convert.FromBase64String(str);
 
      RijndaelManaged rm = new RijndaelManaged
      {
        Key = Encoding.UTF8.GetBytes(key),
        Mode = CipherMode.ECB,
        Padding = PaddingMode.PKCS7
      };
 
      ICryptoTransform cTransform = rm.CreateDecryptor();
      Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
 
      return Encoding.UTF8.GetString(resultArray);
    }

ok,今天关于C#常见加密算法的分享就到这里了!!!

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对猪先飞的支持。

[!--infotagslink--]

相关文章

  • C#实现简单的登录界面

    我们在使用C#做项目的时候,基本上都需要制作登录界面,那么今天我们就来一步步看看,如果简单的实现登录界面呢,本文给出2个例子,由简入难,希望大家能够喜欢。...2020-06-25
  • 浅谈C# 字段和属性

    这篇文章主要介绍了C# 字段和属性的的相关资料,文中示例代码非常详细,供大家参考和学习,感兴趣的朋友可以了解下...2020-11-03
  • C#中截取字符串的的基本方法详解

    这篇文章主要介绍了C#中截取字符串的的基本方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-03
  • C#实现简单的Http请求实例

    这篇文章主要介绍了C#实现简单的Http请求的方法,以实例形式较为详细的分析了C#实现Http请求的具体方法,需要的朋友可以参考下...2020-06-25
  • C#连接SQL数据库和查询数据功能的操作技巧

    本文给大家分享C#连接SQL数据库和查询数据功能的操作技巧,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友参考下吧...2021-05-17
  • C#中new的几种用法详解

    本文主要介绍了C#中new的几种用法,具有很好的参考价值,下面跟着小编一起来看下吧...2020-06-25
  • 使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序)

    这篇文章主要介绍了使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • C#开发Windows窗体应用程序的简单操作步骤

    这篇文章主要介绍了C#开发Windows窗体应用程序的简单操作步骤,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-12
  • C#从数据库读取图片并保存的两种方法

    这篇文章主要介绍了C#从数据库读取图片并保存的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2021-01-16
  • C#和JavaScript实现交互的方法

    最近做一个小项目不可避免的需要前端脚本与后台进行交互。由于是在asp.net中实现,故问题演化成asp.net中jiavascript与后台c#如何进行交互。...2020-06-25
  • C++调用C#的DLL程序实现方法

    本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
  • 轻松学习C#的基础入门

    轻松学习C#的基础入门,了解C#最基本的知识点,C#是一种简洁的,类型安全的一种完全面向对象的开发语言,是Microsoft专门基于.NET Framework平台开发的而量身定做的高级程序设计语言,需要的朋友可以参考下...2020-06-25
  • C#变量命名规则小结

    本文主要介绍了C#变量命名规则小结,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-09
  • C#绘制曲线图的方法

    这篇文章主要介绍了C#绘制曲线图的方法,以完整实例形式较为详细的分析了C#进行曲线绘制的具体步骤与相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • C# 中如何取绝对值函数

    本文主要介绍了C# 中取绝对值的函数。具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
  • c#自带缓存使用方法 c#移除清理缓存

    这篇文章主要介绍了c#自带缓存使用方法,包括获取数据缓存、设置数据缓存、移除指定数据缓存等方法,需要的朋友可以参考下...2020-06-25
  • c#中(&&,||)与(&,|)的区别详解

    这篇文章主要介绍了c#中(&&,||)与(&,|)的区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
  • 经典实例讲解C#递归算法

    这篇文章主要用实例讲解C#递归算法的概念以及用法,文中代码非常详细,帮助大家更好的参考和学习,感兴趣的朋友可以了解下...2020-06-25
  • C#学习笔记- 随机函数Random()的用法详解

    下面小编就为大家带来一篇C#学习笔记- 随机函数Random()的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • C#中list用法实例

    这篇文章主要介绍了C#中list用法,结合实例形式分析了C#中list排序、运算、转换等常见操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25