AES简介

AES, Advanced Encryption Standard,其实是一套规范:FIPS 197,而咱们所说的AES算法其实是Rijndael算法。

NIST (National INstitute of Standards and Technology) 在1997年9月12日公开征集更高效更平安的代替DES加密算法,第一轮共有15种算法入选,其中5种算法入围了决赛,别离是MARS,RC6,Rijndael,Serpent和Twofish。又通过3年的验证、评测及公众探讨之后Rijndael算法最终入选。

Rijndael算法

Rijndael算法是由比利时学者Joan Daemen和Vincent Rijmen所提出的,算法的名字就由两位作者的名字组合而成。Rijndael的劣势在于集安全性、性能、效率、可实现性及灵活性与一体。

背景

因为在HTTP中参数都是通过URL或者Body进行传输的,那么就存在信息的裸露问题,这时候很多敏感的信息就须要进行加密,避免敏感信息泄露。

具体实现

1、服务端加密/解密

public class DecryptStringAES{      /// <summary>        /// AES加密算法        /// </summary>        /// <param name="input">明文字符串</param>        /// <returns>字符串</returns>        public static string EncryptByAES(string input)      {           if (string.IsNullOrWhiteSpace(input))          {              return input;          }          using (RijndaelManaged rijndaelManaged = new RijndaelManaged())          {              rijndaelManaged.Mode = CipherMode.CBC;              rijndaelManaged.Padding = PaddingMode.PKCS7;              rijndaelManaged.FeedbackSize = 128;              rijndaelManaged.Key = Encoding.UTF8.GetBytes(Decrypt.Key);              rijndaelManaged.IV = Encoding.UTF8.GetBytes(Decrypt.AES_IV);              ICryptoTransform encryptor = rijndaelManaged.CreateEncryptor(rijndaelManaged.Key, rijndaelManaged.IV);              using (MemoryStream msEncrypt = new MemoryStream())              {                  using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))                  {                      using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))                      {                          swEncrypt.Write(input);                      }                      byte[] bytes = msEncrypt.ToArray();                      return Convert.ToBase64String(bytes);                  }              }          }      }      /// <summary>        /// AES解密        /// </summary>        /// <param name="input">密文字节数组</param>        /// <returns>返回解密后的字符串</returns>        public static string DecryptByAES(string input)      {             if (string.IsNullOrWhiteSpace(input))          {              return input;          }          var buffer = Convert.FromBase64String(input);          using (RijndaelManaged rijndaelManaged = new RijndaelManaged())          {              rijndaelManaged.Mode = CipherMode.CBC;              rijndaelManaged.Padding = PaddingMode.PKCS7;              rijndaelManaged.FeedbackSize = 128;              rijndaelManaged.Key = Encoding.UTF8.GetBytes(Decrypt.Key);              rijndaelManaged.IV = Encoding.UTF8.GetBytes(Decrypt.AES_IV);              ICryptoTransform decryptor = rijndaelManaged.CreateDecryptor(rijndaelManaged.Key, rijndaelManaged.IV);              using (MemoryStream msEncrypt = new MemoryStream(buffer))              {                  using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, decryptor, CryptoStreamMode.Read))                  {                      using (StreamReader srEncrypt = new StreamReader(csEncrypt))                      {                          return srEncrypt.ReadToEnd();                      }                  }              }          }      }          }

2、 客户端(JS)

  • 应用包

    npm install crypto-js
  • 定义Key/IV

    const key = CryptoJS.enc.Utf8.parse("1234567890000000");const iv = CryptoJS.enc.Utf8.parse("1234567890000000");
    留神:客户端和服务端的KEY/IV必须保持一致
  • 加密办法

    //**************************************************************//*字符串/对象加密//*   0:须要解密的字符串或对象//****************************************************************/function Encrypt(o) { if (typeof (o) === "string") {      if (o) {          var srcs = CryptoJS.enc.Utf8.parse(o);          return CryptoJS.AES.encrypt(srcs, key, {              keySize: 128 / 8,              iv: iv,              mode: CryptoJS.mode.CBC,              padding: CryptoJS.pad.Pkcs7          }).toString();      }  }  else if (typeof (o) === "object") {      for (var _o in o) {          if (o[_o]) {              var srcs = CryptoJS.enc.Utf8.parse(o[_o]);              o[_o] = CryptoJS.AES.encrypt(srcs, key, {                  keySize: 128 / 8,                  iv: iv,                  mode: CryptoJS.mode.CBC,                  padding: CryptoJS.pad.Pkcs7              }).toString();          }      };  }  return o;}
  • 解密办法

    //**************************************************************//*字符串解密//*   str:须要解密的字符串//****************************************************************/function Decrypt(str) { var decrypt = CryptoJS.AES.decrypt(str, key, {      keySize: 128 / 8,      iv: iv,      mode: CryptoJS.mode.CBC,      padding: CryptoJS.pad.Pkcs7  });  var decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);  return decryptedStr;}

3、展现成果

  • 采纳简略的注册信息进行测试
  • Js进行加密后的值
  • 服务端解密的值与注册的验证码统一

参考资料

  • https://www.c-sharpcorner.com...
  • https://stackoverflow.com/que...
  • crypto npm https://www.npmjs.com/package...
  • Aes文档 https://github.com/matt-wu/AES
demo下载地址:https://download.csdn.net/dow...

————————————————
原文链接:https://blog.csdn.net/xhl_jam...