来自于:Hello Bug.

一:前言

常用的文件加密算法有:DES、AES、RSA、SHA-1、MD5…..
.Net自带了安全类库,在System.Security.Cryptography下有一些常用的加密算法
其中MD5属于摘要算法,多用于检查文件是否有修改


二:加密算法介绍

——对称加密
对称加密算法有AES、DES、3DES等
在对称加密算法中,密钥只有一个,加密和解密都使用相同的密钥

——非对称加密
非对称加密算法有RSA、DSA、ECC等
在非对称加密算法中,需要两个密钥,一个公钥一个私钥
如果使用公钥对数据进行加密,只有使用对应的私钥才能进行解密,如果使用私钥对数据进行加密,只有使用对应的公钥才能进行解密

——签名加密算法(散列算法)
签名加密算法有SHA1、MD5、HMAC等
签名加密算法不需要密钥,一般不可逆


三:AES算法

需要注意的是加密后获得的bytes千万别用UTF8去获取字符串,不然会有信息损失,导致后面解密失败

  1. using System;
  2. using System.Security.Cryptography;
  3. using System.Text;
  4. /// <summary>
  5. /// AES工具
  6. /// </summary>
  7. public class AESUtils
  8. {
  9. const string AES_KEY = "dhjkfhskajflwoxj"; //必须为32位,字母的话需要16个
  10. /// <summary>
  11. /// AES加密
  12. /// </summary>
  13. /// <param name="content">明文</param>
  14. public static string Encrypt(string content)
  15. {
  16. if (string.IsNullOrEmpty(content))
  17. {
  18. return null;
  19. }
  20. byte[] contentBytes = Encoding.UTF8.GetBytes(content);
  21. byte[] keyBytes = Encoding.UTF8.GetBytes(AES_KEY);
  22. RijndaelManaged rm = new RijndaelManaged();
  23. rm.Key = keyBytes;
  24. rm.Mode = CipherMode.ECB;
  25. rm.Padding = PaddingMode.PKCS7;
  26. ICryptoTransform ict = rm.CreateEncryptor();
  27. byte[] resultBytes = ict.TransformFinalBlock(contentBytes, 0, contentBytes.Length);
  28. return Convert.ToBase64String(resultBytes, 0, resultBytes.Length);
  29. }
  30. /// <summary>
  31. /// AES解密
  32. /// </summary>
  33. /// <param name="str">密文</param>
  34. public static string Decrypt(string content)
  35. {
  36. if (string.IsNullOrEmpty(content))
  37. {
  38. return null;
  39. }
  40. byte[] contentBytes = Convert.FromBase64String(content);
  41. byte[] keyBytes = Encoding.UTF8.GetBytes(AES_KEY);
  42. RijndaelManaged rm = new RijndaelManaged();
  43. rm.Key = keyBytes;
  44. rm.Mode = CipherMode.ECB;
  45. rm.Padding = PaddingMode.PKCS7;
  46. ICryptoTransform ict = rm.CreateDecryptor();
  47. byte[] resultBytes = ict.TransformFinalBlock(contentBytes, 0, contentBytes.Length);
  48. return Encoding.UTF8.GetString(resultBytes);
  49. }
  50. }

四:DES算法

需要注意的是加密后获得的bytes千万别用UTF8去获取字符串,不然会有信息损失,导致后面解密失败

  1. using System;
  2. using System.Security.Cryptography;
  3. using System.Text;
  4. using System.IO;
  5. using UnityEngine;
  6. /// <summary>
  7. /// DES工具
  8. /// </summary>
  9. public class DESUtils
  10. {
  11. public const string DES_KEY = "lhwyjlyy";
  12. /// <summary>
  13. /// DES加密
  14. /// </summary>
  15. /// <param name="content">明文</param>
  16. public static string Encrypt(string content)
  17. {
  18. if (string.IsNullOrEmpty(content))
  19. {
  20. return null;
  21. }
  22. byte[] contentBytes = Encoding.UTF8.GetBytes(content);
  23. byte[] keyBytes = Encoding.UTF8.GetBytes(DES_KEY);
  24. DESCryptoServiceProvider provider = new DESCryptoServiceProvider();
  25. provider.Key = keyBytes;
  26. provider.IV = keyBytes;
  27. MemoryStream ms = new MemoryStream();
  28. CryptoStream cs = new CryptoStream(ms, provider.CreateEncryptor(), CryptoStreamMode.Write);
  29. cs.Write(contentBytes, 0, contentBytes.Length);
  30. cs.FlushFinalBlock();
  31. return Convert.ToBase64String(ms.ToArray());
  32. }
  33. /// <summary>
  34. /// DES解密
  35. /// </summary>
  36. /// <param name="content">密文</param>
  37. public static string Decrypt(string content)
  38. {
  39. if (string.IsNullOrEmpty(content))
  40. {
  41. return null;
  42. }
  43. byte[] contentBytes = Convert.FromBase64String(content);
  44. byte[] keyBytes = Encoding.UTF8.GetBytes(DES_KEY);
  45. DESCryptoServiceProvider provider = new DESCryptoServiceProvider();
  46. provider.Key = keyBytes;
  47. provider.IV = keyBytes;
  48. MemoryStream ms = new MemoryStream();
  49. CryptoStream cs = new CryptoStream(ms, provider.CreateDecryptor(), CryptoStreamMode.Write);
  50. cs.Write(contentBytes, 0, contentBytes.Length);
  51. cs.FlushFinalBlock();
  52. return Encoding.UTF8.GetString(ms.ToArray());
  53. }
  54. }