SDK_UnityMoney/Assets/Script/Utils/EncryptionUtils.cs

150 lines
4.7 KiB
C#
Raw Normal View History

2025-08-31 14:59:14 +00:00
using System;
using System.Collections;
using System.Collections.Generic;
using System.Security.Cryptography;
using System.Text;
using UnityEngine;
2025-09-01 10:32:50 +00:00
namespace WZ
2025-08-31 14:59:14 +00:00
{
public static class EncryptionUtils
{
2025-09-18 10:30:57 +00:00
public static string BytesToHexString(byte[] bytes, bool isUpperCase)
{
if (bytes == null)
return "";
char[] hexDigits = isUpperCase ? HEX_DIGITS_UPPER : HEX_DIGITS_LOWER;
int len = bytes.Length;
if (len == 0)
return "";
char[] ret = new char[len << 1];
for (int i = 0, j = 0; i < len; i++)
{
ret[j++] = hexDigits[bytes[i] >> 4 & 0x0f];
ret[j++] = hexDigits[bytes[i] & 0x0f];
}
return new string(ret);
}
public static byte[] HexStringToBytes(string hexString)
{
if (IsSpace(hexString))
return new byte[0];
int len = hexString.Length;
if (len % 2 != 0)
{
hexString = "0" + hexString;
len = len + 1;
}
char[] hexBytes = hexString.ToUpper().ToCharArray();
byte[] ret = new byte[len >> 1];
for (int i = 0; i < len; i += 2)
{
ret[i >> 1] = (byte)(HexToDec(hexBytes[i]) << 4 | HexToDec(hexBytes[i + 1]));
}
return ret;
}
public static bool IsSpace(string s)
{
if (s == null)
return true;
for (int i = 0, len = s.Length; i < len; ++i)
{
if (!char.IsWhiteSpace(s[i]))
{
return false;
}
}
return true;
}
private static int HexToDec(char hexChar)
{
if (hexChar >= '0' && hexChar <= '9')
{
return hexChar - '0';
}
else if (hexChar >= 'A' && hexChar <= 'F')
{
return hexChar - 'A' + 10;
}
else
{
throw new ArgumentException();
}
}
private static readonly char[] HEX_DIGITS_UPPER =
{ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
private static readonly char[] HEX_DIGITS_LOWER =
{ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
2025-08-31 14:59:14 +00:00
private static string GetKey(string packageName)
{
var keyBytes = Encoding.UTF8.GetBytes(packageName);
byte[] keyHash;
using (var md5 = MD5.Create())
{
keyHash = md5.ComputeHash(keyBytes);
}
return BitConverter.ToString(keyHash).Replace("-", "").ToUpper();
}
// Aes 加密
public static string AesEncrypt(string packageName, string content)
{
string key = GetKey(packageName);
var contentBytes = Encoding.UTF8.GetBytes(content);
var keyBytes = Encoding.UTF8.GetBytes(key);
byte[] keyHash;
using (var md5 = MD5.Create())
{
keyHash = md5.ComputeHash(keyBytes);
}
using var aesAlg = Aes.Create();
aesAlg.Key = keyHash;
aesAlg.Mode = CipherMode.ECB;
aesAlg.Padding = PaddingMode.PKCS7;
var encryptor = aesAlg.CreateEncryptor();
var encryptedBytes = encryptor.TransformFinalBlock(contentBytes, 0, contentBytes.Length);
return BitConverter.ToString(encryptedBytes).Replace("-", "").ToLower();
}
// Aes 解密
public static string AesDecrypt(string packageName, string encrypted)
{
string key = GetKey(packageName);
var keyBytes = Encoding.UTF8.GetBytes(key);
var encryptedBytes = new byte[encrypted.Length / 2];
for (var i = 0; i < encryptedBytes.Length; i++)
{
encryptedBytes[i] = Convert.ToByte(encrypted.Substring(i * 2, 2), 16);
}
// 使用传统的MD5创建方式
byte[] keyHash;
using (var md5 = MD5.Create())
{
keyHash = md5.ComputeHash(keyBytes);
}
using var aesAlg = Aes.Create();
aesAlg.Key = keyHash;
aesAlg.Mode = CipherMode.ECB;
aesAlg.Padding = PaddingMode.PKCS7;
var decryptor = aesAlg.CreateDecryptor();
var decryptedBytes = decryptor.TransformFinalBlock(encryptedBytes, 0, encryptedBytes.Length);
return Encoding.UTF8.GetString(decryptedBytes);
}
}
}