高级加密标准(AES,Advanced Encryption
Standard)为最常见的对称加密算法(微信小程序加密传输就是用这个加密算法的)。对称加密算法也就是加密和解密用相同的密钥,具体的加密流程如下图:(原理:转自https://blog.csdn.net/qq_28205153/article/details/55798628)




代码实例如下:
using System; using System.Text; using System.Security.Cryptography; using
System.IO; namespace Common.Helper.Crypto {     /// <summary>     /// AES加密解密  
  /// </summary>     public static class AesCrypto     {        
//对称加密和分组加密中的四种模式(ECB、CBC、CFB、OFB),这三种的区别,主要来自于密钥的长度,16位密钥=128位,24位密钥=192位,32位密钥=256位。
        //更多参考:http://www.cnblogs.com/happyhippy/archive/2006/12/23/601353.html
        /// <summary>         /// 检验密钥是否有效长度【16|24|32】         /// </summary>  
      /// <param name="key">密钥</param>         /// <returns>bool</returns>    
    private static bool CheckKey(string key)         {             if
(string.IsNullOrWhiteSpace(key))                 return false;             if
(16.Equals(key.Length) || 24.Equals(key.Length) || 32.Equals(key.Length))      
          return true;             else                 return false;         }
        /// <summary>         /// 检验向量是否有效长度【16】         /// </summary>        
/// <param name="iv">向量</param>         /// <returns>bool</returns>        
private static bool CheckIv(string iv)         {             if
(string.IsNullOrWhiteSpace(iv))                 return false;             if
(16.Equals(iv.Length))                 return true;             else          
      return false;         }         #region 参数是string类型的         ///
<summary>         ///  加密 参数:string         /// </summary>         /// <param
name="palinData">明文</param>         /// <param name="key">密钥</param>        
/// <param name="iv">向量</param>         /// <param
name="encodingType">编码方式</param>         /// <returns>string:密文</returns>      
  public static string Encrypt(string palinData, string key, string iv,
EncodingStrOrByte.EncodingType encodingType =
EncodingStrOrByte.EncodingType.UTF8)         {             if
(string.IsNullOrWhiteSpace(palinData)) return null;             if
(!(CheckKey(key) && CheckIv(iv))) return palinData;             byte[]
toEncryptArray = EncodingStrOrByte.GetBytes(palinData, encodingType);          
  var rm = new RijndaelManaged             {                 IV =
EncodingStrOrByte.GetBytes(iv, encodingType),                 Key =
EncodingStrOrByte.GetBytes(key, encodingType),                 Mode =
CipherMode.ECB,                 Padding = PaddingMode.PKCS7             };    
        ICryptoTransform cTransform = rm.CreateEncryptor();             byte[]
resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0,
toEncryptArray.Length);             return Convert.ToBase64String(resultArray,
0, resultArray.Length);         }         /// <summary>         ///  解密
参数:string         /// </summary>         /// <param
name="encryptedData">密文</param>         /// <param name="key">密钥</param>      
  /// <param name="iv">向量</param>         /// <param
name="encodingType">编码方式</param>         /// <returns>string:明文</returns>      
  public static string Decrypt(string encryptedData, string key, string iv,
EncodingStrOrByte.EncodingType encodingType =
EncodingStrOrByte.EncodingType.UTF8)         {             if
(string.IsNullOrWhiteSpace(encryptedData)) return null;             if
(!(CheckKey(key) && CheckIv(iv))) return encryptedData;             byte[]
toEncryptArray = Convert.FromBase64String(encryptedData);             var rm =
new RijndaelManaged             {                 IV =
EncodingStrOrByte.GetBytes(iv, encodingType),                 Key =
EncodingStrOrByte.GetBytes(key, encodingType),                 Mode =
CipherMode.ECB,                 Padding = PaddingMode.PKCS7             };    
        ICryptoTransform cTransform = rm.CreateDecryptor();             byte[]
resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0,
toEncryptArray.Length);             return
Encoding.UTF8.GetString(resultArray);         }         #endregion        
#region 参数是byte[]类型的         /// <summary>           /// 加密 参数:byte[]         
/// </summary>           /// <param name="palinData">明文</param>           ///
<param name="key">密钥</param>           /// <param name="iv">向量</param>        
  /// <returns>密文</returns>           public static byte[] Encrypt(byte[]
palinData, string key, string iv, EncodingStrOrByte.EncodingType encodingType =
EncodingStrOrByte.EncodingType.UTF8)         {             if (palinData ==
null) return null;             if (!(CheckKey(key) && CheckIv(iv))) return
palinData;             byte[] bKey = new byte[32];            
Array.Copy(EncodingStrOrByte.GetBytes(key.PadRight(bKey.Length), encodingType),
bKey, bKey.Length);             byte[] bVector = new byte[16];            
Array.Copy(EncodingStrOrByte.GetBytes(iv.PadRight(bVector.Length),
encodingType), bVector, bVector.Length);             byte[] cryptograph = null;
// 加密后的密文               Rijndael Aes = Rijndael.Create();             //
开辟一块内存流               using (MemoryStream Memory = new MemoryStream())        
    {                 // 把内存流对象包装成加密流对象                   using (CryptoStream
Encryptor = new CryptoStream(Memory, Aes.CreateEncryptor(bKey, bVector),
CryptoStreamMode.Write))                 {                     // 明文数据写入加密流    
                  Encryptor.Write(palinData, 0, palinData.Length);            
        Encryptor.FlushFinalBlock();                     cryptograph =
Memory.ToArray();                 }             }             return
cryptograph;         }         /// <summary>           /// 解密  参数:byte[]       
  /// </summary>           /// <param name="encryptedData">被解密的密文</param>      
    /// <param name="key">密钥</param>           /// <param
name="iv">向量</param>           /// <returns>明文</returns>           public
static byte[] Decrypt(byte[] encryptedData, string key, string iv,
EncodingStrOrByte.EncodingType encodingType =
EncodingStrOrByte.EncodingType.UTF8)         {             if (encryptedData ==
null) return null;             if (!(CheckKey(key) && CheckIv(iv))) return
encryptedData;             byte[] bKey = new byte[32];            
Array.Copy(EncodingStrOrByte.GetBytes(key.PadRight(bKey.Length), encodingType),
bKey, bKey.Length);             byte[] bVector = new byte[16];            
Array.Copy(EncodingStrOrByte.GetBytes(iv.PadRight(bVector.Length),
encodingType), bVector, bVector.Length);             byte[] original = null; //
解密后的明文               Rijndael Aes = Rijndael.Create();             //
开辟一块内存流,存储密文               using (MemoryStream Memory = new
MemoryStream(encryptedData))             {                 // 把内存流对象包装成加密流对象  
                using (CryptoStream Decryptor = new
CryptoStream(Memory,Aes.CreateDecryptor(bKey, bVector),CryptoStreamMode.Read))
                {                     // 明文存储区                       using
(MemoryStream originalMemory = new MemoryStream())                     {      
                  byte[] Buffer = new byte[1024];                         int
readBytes = 0;                         while ((readBytes =
Decryptor.Read(Buffer, 0, Buffer.Length)) > 0)                         {      
                      originalMemory.Write(Buffer, 0, readBytes);              
          }                         original = originalMemory.ToArray();      
              }                 }             }             return original;  
      }         #endregion     } }


友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:637538335
关注微信