//------------------------------------------------------------ // Game Framework // Copyright © 2013-2020 Jiang Yin. All rights reserved. // Homepage: https://gameframework.cn/ // Feedback: mailto:ellan@gameframework.cn //------------------------------------------------------------ using System; using System.Security.Cryptography; using System.Text; namespace ET { public static partial class Utility { /// /// 加密解密相关的实用函数。 /// public static class Encryption { public const int QuickEncryptLength = 220; /// /// 将 bytes 使用 code 做异或运算的快速版本。 /// /// 原始二进制流。 /// 异或二进制流。 /// 异或后的二进制流。 public static byte[] GetQuickXorBytes(byte[] bytes, byte[] code) { return GetXorBytes(bytes, code, QuickEncryptLength); } /// /// 将 bytes 使用 code 做异或运算的快速版本。此方法将复用并改写传入的 bytes 作为返回值,而不额外分配内存空间。 /// /// 原始及异或后的二进制流。 /// 异或二进制流。 public static void GetQuickSelfXorBytes(byte[] bytes, byte[] code) { GetSelfXorBytes(bytes, code, QuickEncryptLength); } /// /// 将 bytes 使用 code 做异或运算。 /// /// 原始二进制流。 /// 异或二进制流。 /// 异或后的二进制流。 public static byte[] GetXorBytes(byte[] bytes, byte[] code) { return GetXorBytes(bytes, code, -1); } /// /// 将 bytes 使用 code 做异或运算。此方法将复用并改写传入的 bytes 作为返回值,而不额外分配内存空间。 /// /// 原始及异或后的二进制流。 /// 异或二进制流。 public static void GetSelfXorBytes(byte[] bytes, byte[] code) { GetSelfXorBytes(bytes, code, -1); } /// /// 将 bytes 使用 code 做异或运算。 /// /// 原始二进制流。 /// 异或二进制流。 /// 异或计算长度,若小于 0,则计算整个二进制流。 /// 异或后的二进制流。 public static byte[] GetXorBytes(byte[] bytes, byte[] code, int length) { if (bytes == null) { return null; } int bytesLength = bytes.Length; byte[] results = new byte[bytesLength]; Buffer.BlockCopy(bytes, 0, results, 0, bytesLength); GetSelfXorBytes(results, code, length); return results; } /// /// 将 bytes 使用 code 做异或运算。此方法将复用并改写传入的 bytes 作为返回值,而不额外分配内存空间。 /// /// 原始及异或后的二进制流。 /// 异或二进制流。 /// 异或计算长度,若小于 0,则计算整个二进制流。 public static void GetSelfXorBytes(byte[] bytes, byte[] code, int length) { if (bytes == null) { return; } if (code == null) { throw new System.Exception("Code is invalid."); } int codeLength = code.Length; if (codeLength <= 0) { throw new System.Exception("Code length is invalid."); } int bytesLength = bytes.Length; if (length < 0 || length > bytesLength) { length = bytesLength; } int codeIndex = 0; for (int i = 0; i < length; i++) { bytes[i] ^= code[codeIndex++]; codeIndex %= codeLength; } }/// /// 加密字符串 /// /// /// /// /// public static string EncryptStr(string value, string key) { try { Byte[] keyArray = System.Text.Encoding.UTF8.GetBytes(key); Byte[] toEncryptArray = System.Text.Encoding.UTF8.GetBytes(value); RijndaelManaged rijndael = new System.Security.Cryptography.RijndaelManaged(); rijndael.Key = keyArray; rijndael.Mode = System.Security.Cryptography.CipherMode.ECB; rijndael.Padding = System.Security.Cryptography.PaddingMode.PKCS7; System.Security.Cryptography.ICryptoTransform cTransform = rijndael.CreateEncryptor(); Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length); return Convert.ToBase64String(resultArray, 0, resultArray.Length); } catch (Exception ex) { Log.Error(ex); return null; } } /// /// 解密字符串 /// /// /// /// /// public static string DecryptStr(string value, string key) { try { Byte[] keyArray = System.Text.Encoding.UTF8.GetBytes(key); Byte[] toEncryptArray = Convert.FromBase64String(value); RijndaelManaged rijndael = new System.Security.Cryptography.RijndaelManaged(); rijndael.Key = keyArray; rijndael.Mode = System.Security.Cryptography.CipherMode.ECB; rijndael.Padding = System.Security.Cryptography.PaddingMode.PKCS7; System.Security.Cryptography.ICryptoTransform cTransform = rijndael.CreateDecryptor(); Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length); return System.Text.Encoding.UTF8.GetString(resultArray); } catch (Exception ex) { Log.Error(ex); return null; } } /// /// AES 算法加密(ECB模式) 将明文加密 /// /// 明文 /// 密钥 /// 加密后base64编码的密文 public static byte[] AesEncrypt(byte[] toEncryptArray, string Key) { try { byte[] keyArray = Encoding.UTF8.GetBytes(Key); RijndaelManaged rDel = new RijndaelManaged(); rDel.Key = keyArray; rDel.Mode = CipherMode.ECB; rDel.Padding = PaddingMode.PKCS7; ICryptoTransform cTransform = rDel.CreateEncryptor(); byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length); return resultArray; } catch (Exception ex) { Log.Error(ex); return null; } } /// /// AES 算法解密(ECB模式) 将密文base64解码进行解密,返回明文 /// /// 密文 /// 密钥 /// 明文 public static byte[] AesDecrypt(byte[] toDecryptArray, string Key) { try { byte[] keyArray = Encoding.UTF8.GetBytes(Key); RijndaelManaged rDel = new RijndaelManaged(); rDel.Key = keyArray; rDel.Mode = CipherMode.ECB; rDel.Padding = PaddingMode.PKCS7; ICryptoTransform cTransform = rDel.CreateDecryptor(); byte[] resultArray = cTransform.TransformFinalBlock(toDecryptArray, 0, toDecryptArray.Length); return resultArray; } catch (Exception ex) { Log.Error(ex); return null; } } /// /// AES 算法加密(ECB模式) 将明文加密 /// /// 明文 /// 密钥 /// 加密后base64编码的密文 public static byte[] AesCBCEncrypt(byte[] toEncryptArray, string Key,string KeyIV) { try { byte[] keyArray = Encoding.UTF8.GetBytes(Key); byte[] keyIVArray = Encoding.UTF8.GetBytes(KeyIV); RijndaelManaged rDel = new RijndaelManaged(); rDel.Key = keyArray; rDel.IV = keyIVArray; rDel.Mode = CipherMode.CBC; rDel.Padding = PaddingMode.PKCS7; ICryptoTransform cTransform = rDel.CreateEncryptor(); byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length); return resultArray; } catch (Exception ex) { Log.Error(ex); return null; } } /// /// AES 算法解密(ECB模式) 将密文base64解码进行解密,返回明文 /// /// 密文 /// 密钥 /// 明文 public static byte[] AesCBCDecrypt(byte[] toDecryptArray, string Key,string KeyIV) { try { byte[] keyArray = Encoding.UTF8.GetBytes(Key); byte[] keyIVArray = Encoding.UTF8.GetBytes(KeyIV); RijndaelManaged rDel = new RijndaelManaged(); rDel.Key = keyArray; rDel.IV = keyIVArray; rDel.Mode = CipherMode.CBC; rDel.Padding = PaddingMode.PKCS7; ICryptoTransform cTransform = rDel.CreateDecryptor(); byte[] resultArray = cTransform.TransformFinalBlock(toDecryptArray, 0, toDecryptArray.Length); return resultArray; } catch (Exception ex) { Log.Error(ex); return null; } } } } }