面试

常用的几种加密方式,“MD5”,"DES","RSA"

2020-09-21  本文已影响0人  浅谈码生活

由于之前接触过银行的一些系统,所以对几种加密方式有一些了解和使用,而这次想和大家探讨一下目前最流行的三种加密方式。
MD5:公开的算法,任何语言实现后其实都一样,通用的.不可逆加密:原文--加密--密文,密文无法解密出原文,相同原文加密的结果是一样的,不同长度的内容加密后加过都是32位,原文差别很小,结果差别很大,不管文件多大,都能产生32位长度摘要;

 /// <summary>
 /// MD5加密,和动网上的16/32位MD5加密结果相同,
 /// 使用的UTF8编码
 /// </summary>
 /// <param name="source">待加密字串</param>
 /// <param name="length">16或32值之一,其它则采用.net默认MD5加密算法</param>
 /// <returns>加密后的字串</returns>
 public static string Encrypt(string source, int length = 32)//默认参数
 {
     if (string.IsNullOrEmpty(source)) return string.Empty;
     HashAlgorithm provider = CryptoConfig.CreateFromName("MD5") as HashAlgorithm;
     byte[] bytes = Encoding.UTF8.GetBytes(source);//这里需要区别编码的
     byte[] hashValue = provider.ComputeHash(bytes);
     StringBuilder sb = new StringBuilder();
     switch (length)
     {
         case 16://16位密文是32位密文的9到24位字符
             for (int i = 4; i < 12; i++)
             {
                 sb.Append(hashValue[i].ToString("x2"));
             }
             break;
         case 32:
             for (int i = 0; i < 16; i++)
             {
                 sb.Append(hashValue[i].ToString("x2"));
             }
             break;
         default:
             for (int i = 0; i < hashValue.Length; i++)
             {
                 sb.Append(hashValue[i].ToString("x2"));
             }
             break;
     }
     return sb.ToString();
 }

DES:对称可逆加密:加密后能解密回原文,加密key和解密key是同一个,加密解密的速度快,问题是密钥的安全;

public class DesEncrypt
{
    private static byte[] _rgbKey = ASCIIEncoding.ASCII.GetBytes(Constant.DesKey.Substring(0, 8));
    private static byte[] _rgbIV = ASCIIEncoding.ASCII.GetBytes(Constant.DesKey.Insert(0, "w").Substring(0, 8));

    /// <summary>
    /// DES 加密
    /// </summary>
    /// <param name="text">需要加密的值</param>
    /// <returns>加密后的结果</returns>
    public static string Encrypt(string text)
    {
        DESCryptoServiceProvider dsp = new DESCryptoServiceProvider();
        using (MemoryStream memStream = new MemoryStream())
        {
            CryptoStream crypStream = new CryptoStream(memStream, dsp.CreateEncryptor(_rgbKey, _rgbIV), CryptoStreamMode.Write);
            StreamWriter sWriter = new StreamWriter(crypStream);
            sWriter.Write(text);
            sWriter.Flush();
            crypStream.FlushFinalBlock();
            memStream.Flush();
            return Convert.ToBase64String(memStream.GetBuffer(), 0, (int)memStream.Length);
        }
    }

    /// <summary>
    /// DES解密
    /// </summary>
    /// <param name="encryptText"></param>
    /// <returns>解密后的结果</returns>
    public static string Decrypt(string encryptText)
    {
        DESCryptoServiceProvider dsp = new DESCryptoServiceProvider();
        byte[] buffer = Convert.FromBase64String(encryptText);

        using (MemoryStream memStream = new MemoryStream())
        {
            CryptoStream crypStream = new CryptoStream(memStream, dsp.CreateDecryptor(_rgbKey, _rgbIV), CryptoStreamMode.Write);
            crypStream.Write(buffer, 0, buffer.Length);
            crypStream.FlushFinalBlock();
            return ASCIIEncoding.UTF8.GetString(memStream.ToArray());
        }
    }
}

RSA:非对称可逆加密:加密后能解密回原文,加密key和解密key不是一个,而是一对,相比较于前面这一种Des 对称可逆加密性能要差;

 public class RsaEncrypt
 {
     /// <summary>
     /// 获取加密/解密对
     /// 给你一个,是无法推算出另外一个的
     /// Encrypt   Decrypt
     /// </summary>
     /// <returns>Encrypt   Decrypt</returns>
     public static KeyValuePair<string, string> GetKeyPair()
     {
         RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
         string publicKey = RSA.ToXmlString(false);
         string privateKey = RSA.ToXmlString(true);
         return new KeyValuePair<string, string>(publicKey, privateKey);
     }
     /// <summary>
     /// 加密:内容+加密key
     /// </summary>
     /// <param name="content"></param>
     /// <param name="encryptKey">加密key</param>
     /// <returns></returns>
     public static string Encrypt(string content, string encryptKey)
     {
         RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
         rsa.FromXmlString(encryptKey);
         UnicodeEncoding ByteConverter = new UnicodeEncoding();
         byte[] DataToEncrypt = ByteConverter.GetBytes(content);
         byte[] resultBytes = rsa.Encrypt(DataToEncrypt, false);
         return Convert.ToBase64String(resultBytes);
     }
     /// <summary>
     /// 解密  内容+解密key
     /// </summary>
     /// <param name="content"></param>
     /// <param name="decryptKey">解密key</param>
     /// <returns></returns>
     public static string Decrypt(string content, string decryptKey)
     {
         byte[] dataToDecrypt = Convert.FromBase64String(content);
         RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
         RSA.FromXmlString(decryptKey);
         byte[] resultBytes = RSA.Decrypt(dataToDecrypt, false);
         UnicodeEncoding ByteConverter = new UnicodeEncoding();
         return ByteConverter.GetString(resultBytes);
     }
     /// <summary>
     /// 可以合并在一起的,每次产生一组新的密钥
     /// </summary>
     /// <param name="content"></param>
     /// <param name="encryptKey">加密key</param>
     /// <param name="decryptKey">解密key</param>
     /// <returns>加密后结果</returns>
     private static string Encrypt(string content, out string publicKey, out string privateKey)
     {
         RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider();
         publicKey = rsaProvider.ToXmlString(false);
         privateKey = rsaProvider.ToXmlString(true);

         UnicodeEncoding ByteConverter = new UnicodeEncoding();
         byte[] DataToEncrypt = ByteConverter.GetBytes(content);
         byte[] resultBytes = rsaProvider.Encrypt(DataToEncrypt, false);
         return Convert.ToBase64String(resultBytes);
     }
 }
认证.png

大家可以根据上图思考CA如何颁发证书到客户端访问时所需要的交互验证过程,可以下方留言交流@!

上一篇 下一篇

猜你喜欢

热点阅读