//------------------------------------------------------------ // Game Framework // Copyright © 2013-2021 loyalsoft. All rights reserved. // Homepage: http://www.game7000.com/ // Feedback: http://www.game7000.com/ //------------------------------------------------------------ using System; namespace GameFramework { public static partial class Utility { /// /// 加密解密相关的实用函数。 /// public static class Encryption { internal const int QuickEncryptLength = 220; /// /// 将 bytes 使用 code 做异或运算的快速版本。 /// /// 原始二进制流。 /// 异或二进制流。 /// 异或后的二进制流。 public static byte[] GetQuickXorBytes(byte[] bytes, byte[] code) { return GetXorBytes(bytes, 0, QuickEncryptLength, code); } /// /// 将 bytes 使用 code 做异或运算的快速版本。此方法将复用并改写传入的 bytes 作为返回值,而不额外分配内存空间。 /// /// 原始及异或后的二进制流。 /// 异或二进制流。 public static void GetQuickSelfXorBytes(byte[] bytes, byte[] code) { GetSelfXorBytes(bytes, 0, QuickEncryptLength, code); } /// /// 将 bytes 使用 code 做异或运算。 /// /// 原始二进制流。 /// 异或二进制流。 /// 异或后的二进制流。 public static byte[] GetXorBytes(byte[] bytes, byte[] code) { if (bytes == null) { return null; } return GetXorBytes(bytes, 0, bytes.Length, code); } /// /// 将 bytes 使用 code 做异或运算。此方法将复用并改写传入的 bytes 作为返回值,而不额外分配内存空间。 /// /// 原始及异或后的二进制流。 /// 异或二进制流。 public static void GetSelfXorBytes(byte[] bytes, byte[] code) { if (bytes == null) { return; } GetSelfXorBytes(bytes, 0, bytes.Length, code); } /// /// 将 bytes 使用 code 做异或运算。 /// /// 原始二进制流。 /// 异或计算的开始位置。 /// 异或计算长度,若小于 0,则计算整个二进制流。 /// 异或二进制流。 /// 异或后的二进制流。 public static byte[] GetXorBytes(byte[] bytes, int startIndex, int length, byte[] code) { if (bytes == null) { return null; } int bytesLength = bytes.Length; byte[] results = new byte[bytesLength]; Array.Copy(bytes, 0, results, 0, bytesLength); GetSelfXorBytes(results, startIndex, length, code); return results; } /// /// 将 bytes 使用 code 做异或运算。此方法将复用并改写传入的 bytes 作为返回值,而不额外分配内存空间。 /// /// 原始及异或后的二进制流。 /// 异或计算的开始位置。 /// 异或计算长度。 /// 异或二进制流。 public static void GetSelfXorBytes(byte[] bytes, int startIndex, int length, byte[] code) { if (bytes == null) { return; } if (code == null) { throw new GameFrameworkException("Code is invalid."); } int codeLength = code.Length; if (codeLength <= 0) { throw new GameFrameworkException("Code length is invalid."); } if (startIndex < 0 || length < 0 || startIndex + length > bytes.Length) { throw new GameFrameworkException("Start index or length is invalid."); } int codeIndex = startIndex % codeLength; for (int i = startIndex; i < length; i++) { bytes[i] ^= code[codeIndex++]; codeIndex %= codeLength; } } } } }