翼度科技»论坛 编程开发 .net 查看内容

加密算法解析:MD5、DES和RAS的工作原理与特点

6

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
一、MD5不可逆加密

1.1-理解MD5


  • MD5公开的算法,任何语言实现后其实都是一样的、通用的
  • 不可逆加密:原文——加密——密文,密文无法解密出原文

1.2-MD5封装
  1. using System.IO;
  2. using System.Security.Cryptography;       
  3.         /// <summary>
  4.     /// 不可逆加密
  5.     /// 1 防止被篡改
  6.     /// 2 防止明文存储
  7.     /// 3 防止抵赖,数字签名
  8.     /// </summary>
  9.     public class MD5Encrypt
  10.     {
  11.         #region MD5
  12.         /// <summary>
  13.         /// MD5加密,和动网上的16/32位MD5加密结果相同,
  14.         /// 使用的UTF8编码
  15.         /// </summary>
  16.         /// <param name="source">待加密字串</param>
  17.         /// <param name="length">16或32值之一,其它则采用.net默认MD5加密算法</param>
  18.         /// <returns>加密后的字串</returns>
  19.         public static string Encrypt(string source, int length = 32)//默认参数
  20.         {
  21.             if (string.IsNullOrEmpty(source)) return string.Empty;
  22.             HashAlgorithm provider = CryptoConfig.CreateFromName("MD5") as HashAlgorithm;
  23.             byte[] bytes = Encoding.UTF8.GetBytes(source);//这里需要区别编码的
  24.             byte[] hashValue = provider.ComputeHash(bytes);
  25.             StringBuilder sb = new StringBuilder();
  26.             switch (length)
  27.             {
  28.                 case 16://16位密文是32位密文的9到24位字符
  29.                     for (int i = 4; i < 12; i++)
  30.                     {
  31.                         sb.Append(hashValue[i].ToString("x2"));
  32.                     }
  33.                     break;
  34.                 case 32:
  35.                     for (int i = 0; i < 16; i++)
  36.                     {
  37.                         sb.Append(hashValue[i].ToString("x2"));
  38.                     }
  39.                     break;
  40.                 default:
  41.                     for (int i = 0; i < hashValue.Length; i++)
  42.                     {
  43.                         sb.Append(hashValue[i].ToString("x2"));
  44.                     }
  45.                     break;
  46.             }
  47.             return sb.ToString();
  48.         }
  49.         #endregion MD5
  50.         #region MD5摘要
  51.         /// <summary>
  52.         /// 获取文件的MD5摘要
  53.         /// </summary>
  54.         /// <param name="fileName"></param>
  55.         /// <returns></returns>
  56.         public static string AbstractFile(string fileName)
  57.         {
  58.             using (FileStream file = new FileStream(fileName, FileMode.Open))
  59.             {
  60.                 return AbstractFile(file);
  61.             }
  62.         }
  63.         
  64.         /// <summary>
  65.         /// 根据stream获取文件摘要
  66.         /// </summary>
  67.         /// <param name="stream"></param>
  68.         /// <returns></returns>
  69.         public static string AbstractFile(Stream stream)
  70.         {
  71.             MD5 md5 = new MD5CryptoServiceProvider();
  72.             byte[] retVal = md5.ComputeHash(stream);
  73.             StringBuilder sb = new StringBuilder();
  74.             for (int i = 0; i < retVal.Length; i++)
  75.             {
  76.                 sb.Append(retVal[i].ToString("x2"));
  77.             }
  78.             return sb.ToString();
  79.         }
  80.         #endregion
  81.     }
复制代码
1.3-MD5总结


  • 相同原文加密的结果是一样的
  • 不同长度的内容加密后都是32位,可以自行改变长度
  • 原文件改动差别很小,结果差别很大
  • 不管文件多大,都能产生32位长度的【摘要】,就是更具文件流进行加密的结果

    • 文件内容有一点改动,结果变化非常大
    • 文件内容不变,文件名变了,结果是不变的


1.4-MD5用途?


  • 防篡改

    • 源代码管理器
    • 急速秒传

      • 在本地进行MD5摘要,到服务器上去检查,如果存在就不需要上传,直接在服务器上复制一份,或者指向路径跳转一下。


  • 密码保存:防止看到明文

    • 密文是可见的,所以要求密码不能太检查;加盐(特殊字符+字母+数字)
    • MD5是无法全部穷举出来的,无法全部解密出来的,像网上有很多这种;



  • 防止抵赖,数字签名

    • 吧一些内容摘要一下,不能抵赖。


二、对称可逆加密DES

2.1-理解DES


  • 对称可逆加密是公开的算法,任何语言实现后其实都一样,通用的。
  • 加密后能解密会原文,但是需要一个Key
  • 加密key和加密Key是同一个,也就是开门和锁门都要用同一吧钥匙
  • 优点:加密解密的速度快
  • 缺点:问题是秘钥的安全(key在网络中传输呗窃取),不是很安全
理解什么是对称可逆加密:

  • 对称:加密/解密是key要一模一样的
  • 可逆:原文加密到密文,密文解密到原文

2.2-DES封装
  1.         /// <summary>
  2.     /// Des加密
  3.     /// </summary>
  4.     public class DesCrypto
  5.     {
  6.         //密钥
  7.         private const string sKey = "qJzGEh6hESZDVJeCnFPGuxzaiB7NLQM3";
  8.         //矢量,矢量可以为空
  9.         private const string sIV = "qcDY6X+aPLw=";
  10.         //构造一个对称算法
  11.         private SymmetricAlgorithm mCSP = new TripleDESCryptoServiceProvider();
  12.         /// <summary>
  13.         /// 构造函数
  14.         /// </summary>
  15.         public DesCrypto() {
  16.         
  17.         }
  18.         #region public string EncryptString(string Value)
  19.         /// <summary>
  20.         /// 加密字符串
  21.         /// </summary>
  22.         /// <param name="Value">输入的字符串</param>
  23.         /// <returns>加密后的字符串</returns>
  24.         public string EncryptString(string Value)
  25.         {
  26.             ICryptoTransform ct;
  27.             MemoryStream ms;
  28.             CryptoStream cs;
  29.             byte[] byt;
  30.             mCSP.Key = Convert.FromBase64String(sKey);
  31.             mCSP.IV = Convert.FromBase64String(sIV);
  32.             //指定加密的运算模式
  33.             mCSP.Mode = System.Security.Cryptography.CipherMode.ECB;
  34.             //获取或设置加密算法的填充模式
  35.             mCSP.Padding = System.Security.Cryptography.PaddingMode.PKCS7;
  36.             ct = mCSP.CreateEncryptor(mCSP.Key, mCSP.IV);
  37.             byt = Encoding.UTF8.GetBytes(Value);
  38.             ms = new MemoryStream();
  39.             cs = new CryptoStream(ms, ct, CryptoStreamMode.Write);
  40.             cs.Write(byt, 0, byt.Length);
  41.             cs.FlushFinalBlock();
  42.             cs.Close();
  43.             return Convert.ToBase64String(ms.ToArray());
  44.         }
  45.         #endregion
  46.         #region public string DecryptString(string Value)
  47.         /// <summary>
  48.         /// 解密字符串
  49.         /// </summary>
  50.         /// <param name="Value">加过密的字符串</param>
  51.         /// <returns>解密后的字符串</returns>
  52.         public string DecryptString(string Value)
  53.         {
  54.             ICryptoTransform ct;
  55.             MemoryStream ms;
  56.             CryptoStream cs;
  57.             byte[] byt;
  58.             mCSP.Key = Convert.FromBase64String(sKey);
  59.             mCSP.IV = Convert.FromBase64String(sIV);
  60.             mCSP.Mode = System.Security.Cryptography.CipherMode.ECB;
  61.             mCSP.Padding = System.Security.Cryptography.PaddingMode.PKCS7;
  62.             ct = mCSP.CreateDecryptor(mCSP.Key, mCSP.IV);
  63.             byt = Convert.FromBase64String(Value);
  64.             ms = new MemoryStream();
  65.             cs = new CryptoStream(ms, ct, CryptoStreamMode.Write);
  66.             cs.Write(byt, 0, byt.Length);
  67.             cs.FlushFinalBlock();
  68.             cs.Close();
  69.             return Encoding.UTF8.GetString(ms.ToArray());
  70.         }
  71.         #endregion
  72.     }
复制代码
三、非对称可逆加密RSA

2.1-理解RSA


  • 非对称可逆加密公开的算法,任何语言实现后其实都一样,通用的;
  • 加密key和解密key不是一个,而是一对
  • 加密key和解密key不能相互推到,有密文,没有解密key,也推导不出原文
  • 缺点:速度不快
  • 优点:安全性好

2.2-RSA封装
  1. /// <summary>
  2.     /// RSA加密解密及RSA签名和验证
  3.     /// </summary>
  4.     public class RsaEncrypt
  5.     {
  6.         public RsaEncrypt()
  7.         {
  8.         }
  9.         #region RSA 的密钥产生
  10.         /// <summary>
  11.         /// RSA 的密钥产生 产生私钥 和公钥
  12.         /// </summary>
  13.         /// <param name="xmlKeys"></param>
  14.         /// <param name="xmlPublicKey"></param>
  15.         public void RSAKey(out string xmlKeys, out string xmlPublicKey)
  16.         {
  17.             System.Security.Cryptography.RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
  18.             xmlKeys = rsa.ToXmlString(true);
  19.             xmlPublicKey = rsa.ToXmlString(false);
  20.         }
  21.         #endregion
  22.         #region RSA的加密函数
  23.         //##############################################################################
  24.         //RSA 方式加密
  25.         //说明KEY必须是XML的行式,返回的是字符串
  26.         //在有一点需要说明!!该加密方式有 长度 限制的!!
  27.         //##############################################################################
  28.         //RSA的加密函数  string
  29.         public string RSAEncrypt(string xmlPublicKey, string m_strEncryptString)
  30.         {
  31.             byte[] PlainTextBArray;
  32.             byte[] CypherTextBArray;
  33.             string Result;
  34.             RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
  35.             rsa.FromXmlString(xmlPublicKey);
  36.             PlainTextBArray = (new UnicodeEncoding()).GetBytes(m_strEncryptString);
  37.             CypherTextBArray = rsa.Encrypt(PlainTextBArray, false);
  38.             Result = Convert.ToBase64String(CypherTextBArray);
  39.             return Result;
  40.         }
  41.         //RSA的加密函数 byte[]
  42.         public string RSAEncrypt(string xmlPublicKey, byte[] EncryptString)
  43.         {
  44.             byte[] CypherTextBArray;
  45.             string Result;
  46.             RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
  47.             rsa.FromXmlString(xmlPublicKey);
  48.             CypherTextBArray = rsa.Encrypt(EncryptString, false);
  49.             Result = Convert.ToBase64String(CypherTextBArray);
  50.             return Result;
  51.         }
  52.         #endregion
  53.         #region RSA的解密函数
  54.         //RSA的解密函数  string
  55.         public string RSADecrypt(string xmlPrivateKey, string m_strDecryptString)
  56.         {
  57.             byte[] PlainTextBArray;
  58.             byte[] DypherTextBArray;
  59.             string Result;
  60.             System.Security.Cryptography.RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
  61.             rsa.FromXmlString(xmlPrivateKey);
  62.             PlainTextBArray = Convert.FromBase64String(m_strDecryptString);
  63.             DypherTextBArray = rsa.Decrypt(PlainTextBArray, false);
  64.             Result = (new UnicodeEncoding()).GetString(DypherTextBArray);
  65.             return Result;
  66.         }
  67.         //RSA的解密函数  byte
  68.         public string RSADecrypt(string xmlPrivateKey, byte[] DecryptString)
  69.         {
  70.             byte[] DypherTextBArray;
  71.             string Result;
  72.             System.Security.Cryptography.RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
  73.             rsa.FromXmlString(xmlPrivateKey);
  74.             DypherTextBArray = rsa.Decrypt(DecryptString, false);
  75.             Result = (new UnicodeEncoding()).GetString(DypherTextBArray);
  76.             return Result;
  77.         }
  78.         #endregion
  79.         #region RSA数字签名
  80.             #region 获取Hash描述表
  81.             //获取Hash描述表 ,outofmemory.cn
  82.             public bool GetHash(string m_strSource, ref byte[] HashData)
  83.             {
  84.                 //从字符串中取得Hash描述
  85.                 byte[] Buffer;
  86.                 System.Security.Cryptography.HashAlgorithm MD5 = System.Security.Cryptography.HashAlgorithm.Create("MD5");
  87.                 Buffer = System.Text.Encoding.GetEncoding("GB2312").GetBytes(m_strSource);
  88.                 HashData = MD5.ComputeHash(Buffer);
  89.                 return true;
  90.             }
  91.             //获取Hash描述表
  92.             public bool GetHash(string m_strSource, ref string strHashData)
  93.             {
  94.                 //从字符串中取得Hash描述
  95.                 byte[] Buffer;
  96.                 byte[] HashData;
  97.                 System.Security.Cryptography.HashAlgorithm MD5 = System.Security.Cryptography.HashAlgorithm.Create("MD5");
  98.                 Buffer = System.Text.Encoding.GetEncoding("GB2312").GetBytes(m_strSource);
  99.                 HashData = MD5.ComputeHash(Buffer);
  100.                 strHashData = Convert.ToBase64String(HashData);
  101.                 return true;
  102.             }
  103.             //获取Hash描述表
  104.             public bool GetHash(System.IO.FileStream objFile, ref byte[] HashData)
  105.             {
  106.                 //从文件中取得Hash描述
  107.                 System.Security.Cryptography.HashAlgorithm MD5 = System.Security.Cryptography.HashAlgorithm.Create("MD5");
  108.                 HashData = MD5.ComputeHash(objFile);
  109.                 objFile.Close();
  110.                 return true;
  111.             }
  112.             //获取Hash描述表
  113.             public bool GetHash(System.IO.FileStream objFile, ref string strHashData)
  114.             {
  115.                 //从文件中取得Hash描述
  116.                 byte[] HashData;
  117.                 System.Security.Cryptography.HashAlgorithm MD5 = System.Security.Cryptography.HashAlgorithm.Create("MD5");
  118.                 HashData = MD5.ComputeHash(objFile);
  119.                 objFile.Close();
  120.                 strHashData = Convert.ToBase64String(HashData);
  121.                 return true;
  122.             }
  123.             #endregion
  124.             #region RSA签名
  125.             //RSA签名
  126.             public bool SignatureFormatter(string p_strKeyPrivate, byte[] HashbyteSignature, ref byte[] EncryptedSignatureData)
  127.             {
  128.                 System.Security.Cryptography.RSACryptoServiceProvider RSA = new System.Security.Cryptography.RSACryptoServiceProvider();
  129.                 RSA.FromXmlString(p_strKeyPrivate);
  130.                 System.Security.Cryptography.RSAPKCS1SignatureFormatter RSAFormatter = new System.Security.Cryptography.RSAPKCS1SignatureFormatter(RSA);
  131.                 //设置签名的算法为MD5
  132.                 RSAFormatter.SetHashAlgorithm("MD5");
  133.                 //执行签名
  134.                 EncryptedSignatureData = RSAFormatter.CreateSignature(HashbyteSignature);
  135.                 return true;
  136.             }
  137.             //RSA签名
  138.             public bool SignatureFormatter(string p_strKeyPrivate, byte[] HashbyteSignature, ref string m_strEncryptedSignatureData)
  139.             {
  140.                 byte[] EncryptedSignatureData;
  141.                 System.Security.Cryptography.RSACryptoServiceProvider RSA = new System.Security.Cryptography.RSACryptoServiceProvider();
  142.                 RSA.FromXmlString(p_strKeyPrivate);
  143.                 System.Security.Cryptography.RSAPKCS1SignatureFormatter RSAFormatter = new System.Security.Cryptography.RSAPKCS1SignatureFormatter(RSA);
  144.                 //设置签名的算法为MD5
  145.                 RSAFormatter.SetHashAlgorithm("MD5");
  146.                 //执行签名
  147.                 EncryptedSignatureData = RSAFormatter.CreateSignature(HashbyteSignature);
  148.                 m_strEncryptedSignatureData = Convert.ToBase64String(EncryptedSignatureData);
  149.                 return true;
  150.             }
  151.             //RSA签名
  152.             public bool SignatureFormatter(string p_strKeyPrivate, string m_strHashbyteSignature, ref byte[] EncryptedSignatureData)
  153.             {
  154.                 byte[] HashbyteSignature;
  155.                 HashbyteSignature = Convert.FromBase64String(m_strHashbyteSignature);
  156.                 System.Security.Cryptography.RSACryptoServiceProvider RSA = new System.Security.Cryptography.RSACryptoServiceProvider();
  157.                 RSA.FromXmlString(p_strKeyPrivate);
  158.                 System.Security.Cryptography.RSAPKCS1SignatureFormatter RSAFormatter = new System.Security.Cryptography.RSAPKCS1SignatureFormatter(RSA);
  159.                 //设置签名的算法为MD5
  160.                 RSAFormatter.SetHashAlgorithm("MD5");
  161.                 //执行签名
  162.                 EncryptedSignatureData = RSAFormatter.CreateSignature(HashbyteSignature);
  163.                 return true;
  164.             }
  165.             //RSA签名
  166.             public bool SignatureFormatter(string p_strKeyPrivate, string m_strHashbyteSignature, ref string m_strEncryptedSignatureData)
  167.             {
  168.                 byte[] HashbyteSignature;
  169.                 byte[] EncryptedSignatureData;
  170.                 HashbyteSignature = Convert.FromBase64String(m_strHashbyteSignature);
  171.                 System.Security.Cryptography.RSACryptoServiceProvider RSA = new System.Security.Cryptography.RSACryptoServiceProvider();
  172.                 RSA.FromXmlString(p_strKeyPrivate);
  173.                 System.Security.Cryptography.RSAPKCS1SignatureFormatter RSAFormatter = new System.Security.Cryptography.RSAPKCS1SignatureFormatter(RSA);
  174.                 //设置签名的算法为MD5
  175.                 RSAFormatter.SetHashAlgorithm("MD5");
  176.                 //执行签名
  177.                 EncryptedSignatureData = RSAFormatter.CreateSignature(HashbyteSignature);
  178.                 m_strEncryptedSignatureData = Convert.ToBase64String(EncryptedSignatureData);
  179.                 return true;
  180.             }
  181.             #endregion
  182.             #region RSA 签名验证
  183.             public bool SignatureDeformatter(string p_strKeyPublic, byte[] HashbyteDeformatter, byte[] DeformatterData)
  184.             {
  185.                 System.Security.Cryptography.RSACryptoServiceProvider RSA = new System.Security.Cryptography.RSACryptoServiceProvider();
  186.                 RSA.FromXmlString(p_strKeyPublic);
  187.                 System.Security.Cryptography.RSAPKCS1SignatureDeformatter RSADeformatter = new System.Security.Cryptography.RSAPKCS1SignatureDeformatter(RSA);
  188.                 //指定解密的时候HASH算法为MD5
  189.                 RSADeformatter.SetHashAlgorithm("MD5");
  190.                 if (RSADeformatter.VerifySignature(HashbyteDeformatter, DeformatterData))
  191.                 {
  192.                     return true;
  193.                 }
  194.                 else
  195.                 {
  196.                     return false;
  197.                 }
  198.             }
  199.             public bool SignatureDeformatter(string p_strKeyPublic, string p_strHashbyteDeformatter, byte[] DeformatterData)
  200.             {
  201.                 byte[] HashbyteDeformatter;
  202.                 HashbyteDeformatter = Convert.FromBase64String(p_strHashbyteDeformatter);
  203.                 System.Security.Cryptography.RSACryptoServiceProvider RSA = new System.Security.Cryptography.RSACryptoServiceProvider();
  204.                 RSA.FromXmlString(p_strKeyPublic);
  205.                 System.Security.Cryptography.RSAPKCS1SignatureDeformatter RSADeformatter = new System.Security.Cryptography.RSAPKCS1SignatureDeformatter(RSA);
  206.                 //指定解密的时候HASH算法为MD5
  207.                 RSADeformatter.SetHashAlgorithm("MD5");
  208.                 if (RSADeformatter.VerifySignature(HashbyteDeformatter, DeformatterData))
  209.                 {
  210.                     return true;
  211.                 }
  212.                 else
  213.                 {
  214.                     return false;
  215.                 }
  216.             }
  217.             public bool SignatureDeformatter(string p_strKeyPublic, byte[] HashbyteDeformatter, string p_strDeformatterData)
  218.             {
  219.                 byte[] DeformatterData;
  220.                 System.Security.Cryptography.RSACryptoServiceProvider RSA = new System.Security.Cryptography.RSACryptoServiceProvider();
  221.                 RSA.FromXmlString(p_strKeyPublic);
  222.                 System.Security.Cryptography.RSAPKCS1SignatureDeformatter RSADeformatter = new System.Security.Cryptography.RSAPKCS1SignatureDeformatter(RSA);
  223.                 //指定解密的时候HASH算法为MD5
  224.                 RSADeformatter.SetHashAlgorithm("MD5");
  225.                 DeformatterData = Convert.FromBase64String(p_strDeformatterData);
  226.                 if (RSADeformatter.VerifySignature(HashbyteDeformatter, DeformatterData))
  227.                 {
  228.                     return true;
  229.                 }
  230.                 else
  231.                 {
  232.                     return false;
  233.                 }
  234.             }
  235.             public bool SignatureDeformatter(string p_strKeyPublic, string p_strHashbyteDeformatter, string p_strDeformatterData)
  236.             {
  237.                 byte[] DeformatterData;
  238.                 byte[] HashbyteDeformatter;
  239.                 HashbyteDeformatter = Convert.FromBase64String(p_strHashbyteDeformatter);
  240.                 System.Security.Cryptography.RSACryptoServiceProvider RSA = new System.Security.Cryptography.RSACryptoServiceProvider();
  241.                 RSA.FromXmlString(p_strKeyPublic);
  242.                 System.Security.Cryptography.RSAPKCS1SignatureDeformatter RSADeformatter = new System.Security.Cryptography.RSAPKCS1SignatureDeformatter(RSA);
  243.                 //指定解密的时候HASH算法为MD5
  244.                 RSADeformatter.SetHashAlgorithm("MD5");
  245.                 DeformatterData = Convert.FromBase64String(p_strDeformatterData);
  246.                 if (RSADeformatter.VerifySignature(HashbyteDeformatter, DeformatterData))
  247.                 {
  248.                     return true;
  249.                 }
  250.                 else
  251.                 {
  252.                     return false;
  253.                 }
  254.             }
  255.             #endregion
  256.         #endregion
  257.     }
复制代码
2.3-公钥/私钥


  • 公钥:公开的Key
  • 私钥:不公开的Key
  • 公开加密Key——>保证数据的安全传递
  • 公开解密Key——>保证数据的不可抵赖
  • C#内置实现了公钥加密/私钥解密,如果想要用第三方的DLL-BounccyCastle



四、数字证书

2.1-CA证书



2.2-单边认证https



2.3-双边认证




原文链接:https://www.cnblogs.com/kimiliucn/p/17607330.html

来源:https://www.cnblogs.com/kimiliucn/archive/2023/08/05/17607330.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具