//------------------------------------------------------------
// 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;
}
}
}
}
}