12.加密模块

12.加密模块


12.1 知识点

加密模块的作用

在游戏开发中,数据安全是一个重要的问题。玩家可能使用内存修改器(如Cheat Engine)来修改游戏数据,实现作弊效果。

常见的作弊场景:

  • 修改玩家金币:直接修改内存中的金币数值
  • 修改玩家血量:让角色变无敌
  • 修改游戏分数:刷排行榜
  • 修改角色属性:增加攻击力、防御力等

问题根源:

  • 内存中的数据是明文存储的:玩家可以直接在内存中看到和修改数值
  • 缺乏防护机制:没有对存储的数据进行加密
  • 容易被检测:使用修改器容易找到并修改相关数值

解决方案:
通过在内存中对关键数据进行加密存储,即使玩家使用修改器找到了内存地址,也无法直接修改或理解数据的真实值。

主要功能:

  1. 数据加密:将明文数据加密后存储在内存中
  2. 数据解密:需要使用时将加密数据解密还原
  3. 随机密钥:为每个对象生成唯一密钥,增强安全性
  4. 异或加密:使用简单高效的异或加密算法

加密模块的基本原理

设计理念:

  • 透明加密:对使用方透明,不需要关心具体加密实现
  • 高效加密:使用异或等位运算,加密解密速度快
  • 随机密钥:每个对象使用不同密钥,防止全局破解
  • 可逆操作:加密和解密必须是对称的可逆操作

工作原理:

  1. 初始化时生成密钥:每个数据对象创建时生成随机密钥
  2. 写入时加密:设置值的时候,先加密再存储
  3. 读取时解密:获取值的时候,先解密再返回
  4. 内存中存储密文:实际内存中存储的是加密后的值

加密模块实现

为什么需要加密模块

传统数据存储方式的问题:

// 传统方式:直接存储明文数据
public class Player
{
    private int hp = 100;
    private int atk = 50;
    
    public int HP
    {
        get { return hp; }
        set { hp = value; }
    }
}

存在的问题:

  1. 内存明文存储:使用Cheat Engine可以直接搜索到100、50这样的值
  2. 容易被修改:玩家可以轻松将100改成99999
  3. 缺乏保护:没有任何防止修改的机制

加密后的数据存储方式:

// 加密方式:存储加密后的数据
public class Player
{
    private int encryptedHp;
    private int key;
    
    public Player()
    {
        key = EncryptionUtil.GetRandomKey(); // 生成随机密钥
    }
    
    public int HP
    {
        get 
        { 
            // 读取时解密
            return EncryptionUtil.UnLockValue(encryptedHp, key); 
        }
        set 
        { 
            // 写入时加密
            encryptedHp = EncryptionUtil.LockValue(value, key); 
        }
    }
}

优势:

  1. 内存中存储密文:实际存储的是加密后的值,如”12345678”
  2. 难以理解:玩家不知道真实值是什么
  3. 难以修改:即使修改了,也不容易算出正确的加密值

加密模块实现

核心思想:使用异或加密

异或运算的特点:

  • A ^ B ^ B = A(异或两次会还原)
  • 加密和解密可以使用相同的算法

EncryptionUtil实现:EncryptionUtil.cs

using UnityEngine;

/// <summary>
/// 加密工具类
/// 主要提供加密需求
/// </summary>
public class EncryptionUtil
{
    /// <summary>
    /// 获取随机密钥
    /// </summary>
    /// <returns>返回1-10000之间的随机密钥</returns>
    public static int GetRandomKey()
    {
        return Random.Range(1, 10000) + 5;
    }

    /// <summary>
    /// 加密int数据
    /// </summary>
    /// <param name="value">要加密的值</param>
    /// <param name="key">加密密钥</param>
    /// <returns>加密后的值</returns>
    public static int LockValue(int value, int key)
    {
        // 主要采用异或加密
        value = value ^ (key % 9);
        value = value ^ 0xADAD;
        value = value ^ (1 << 5);
        value += key;
        return value;
    }

    /// <summary>
    /// 加密long数据
    /// </summary>
    /// <param name="value">要加密的值</param>
    /// <param name="key">加密密钥</param>
    /// <returns>加密后的值</returns>
    public static long LockValue(long value, int key)
    {
        // 主要采用异或加密
        value = value ^ (key % 9);
        value = value ^ 0xADAD;
        value = value ^ (1 << 5);
        value += key;
        return value;
    }

    /// <summary>
    /// 解密int数据
    /// </summary>
    /// <param name="value">要解密的值</param>
    /// <param name="key">解密密钥</param>
    /// <returns>解密后的值</returns>
    public static int UnLockValue(int value, int key)
    {
        // 有可能还没有加密过 没有初始化过的数据 直接想要获取 那么就不用解密了
        // 这种时候数值肯定是0
        if (value == 0)
            return value;
        
        // 逆向操作还原数据(操作顺序相反)
        value -= key;
        value = value ^ (1 << 5);
        value = value ^ 0xADAD;
        value = value ^ (key % 9);
        return value;
    }

    /// <summary>
    /// 解密long数据
    /// </summary>
    /// <param name="value">要解密的值</param>
    /// <param name="key">解密密钥</param>
    /// <returns>解密后的值</returns>
    public static long UnLockValue(long value, int key)
    {
        // 有可能还没有加密过 没有初始化过的数据 直接想要获取 那么就不用解密了
        // 这种时候数值肯定是0
        if (value == 0)
            return value;
        
        // 逆向操作还原数据(操作顺序相反)
        value -= key;
        value = value ^ (1 << 5);
        value = value ^ 0xADAD;
        value = value ^ (key % 9);
        return value;
    }
}

加密流程说明:

// 假设要加密的值是 100,密钥是 999
int value = 100;
int key = 999;

// 加密步骤:
// 1. value = 100 ^ (999 % 9) = 100 ^ 3
// 2. value = value ^ 0xADAD
// 3. value = value ^ (1 << 5) = value ^ 32
// 4. value = value + 999

// 解密步骤(逆向):
// 1. value = value - 999
// 2. value = value ^ 32
// 3. value = value ^ 0xADAD
// 4. value = value ^ 3
// 5. 得到原始值 100

加密算法的组成部分:

  1. **^ (key % 9)**:使用密钥的模9值进行异或
  2. **^ 0xADAD**:使用固定值0xADAD进行异或(混淆)
  3. **^ (1 << 5)**:使用32(2的5次方)进行异或(再次混淆)
  4. **+= key**:加上密钥值(增加复杂性)

这样设计的好处:

  • 多层加密:多次异或和加法操作,增加破解难度
  • 密钥相关:加密结果与密钥相关,不同对象有不同的密文
  • 可逆操作:所有操作都可以逆向,保证能正确解密

加密模块使用示例

基础使用示例:

using UnityEngine;

/// <summary>
/// 加密模块使用示例
/// </summary>
public class EncryptionExample : MonoBehaviour
{
    void Start()
    {
        // 创建玩家对象
        Player player = new Player();
        
        // 设置血量
        player.HP = 100;
        Debug.Log($"设置血量:100");
        
        // 获取血量(会解密)
        int currentHP = player.HP;
        Debug.Log($"当前血量:{currentHP}");
        // 输出:当前血量:100
        
        // 修改血量
        player.HP = 80;
        Debug.Log($"修改后血量:{player.HP}");
        // 输出:修改后血量:80
    }
}

/// <summary>
/// 玩家类(带加密保护)
/// </summary>
public class Player
{
    private int encryptedHp;
    private int encryptedAtk;
    private int encryptedMoney;
    
    /// <summary>
    /// 加密密钥
    /// </summary>
    private int key;

    public Player()
    {
        // 初始化时生成随机密钥
        key = EncryptionUtil.GetRandomKey();
        Debug.Log($"生成密钥:{key}");
    }

    /// <summary>
    /// 血量(加密属性)
    /// </summary>
    public int HP
    {
        get
        {
            // 读取时解密
            return EncryptionUtil.UnLockValue(encryptedHp, key);
        }
        set
        {
            // 写入时加密
            encryptedHp = EncryptionUtil.LockValue(value, key);
        }
    }

    /// <summary>
    /// 攻击力(加密属性)
    /// </summary>
    public int Atk
    {
        get
        {
            return EncryptionUtil.UnLockValue(encryptedAtk, key);
        }
        set
        {
            encryptedAtk = EncryptionUtil.LockValue(value, key);
        }
    }

    /// <summary>
    /// 金币(加密属性)
    /// </summary>
    public int Money
    {
        get
        {
            return EncryptionUtil.UnLockValue(encryptedMoney, key);
        }
        set
        {
            encryptedMoney = EncryptionUtil.LockValue(value, key);
        }
    }
}

实际应用场景:

using UnityEngine;

/// <summary>
/// 加密模块实际应用示例
/// </summary>
public class EncryptionUsageExample : MonoBehaviour
{
    void Start()
    {
        // 测试加密功能
        TestEncryption();
        
        // 测试玩家数据加密
        TestPlayerEncryption();
    }

    /// <summary>
    /// 测试加密功能
    /// </summary>
    private void TestEncryption()
    {
        Debug.Log("=== 测试加密功能 ===");
        
        int key = EncryptionUtil.GetRandomKey();
        Debug.Log($"生成密钥:{key}");
        
        // 测试加密和解密
        int originalValue = 100;
        int encryptedValue = EncryptionUtil.LockValue(originalValue, key);
        int decryptedValue = EncryptionUtil.UnLockValue(encryptedValue, key);
        
        Debug.Log($"原始值:{originalValue}");
        Debug.Log($"加密后:{encryptedValue}");
        Debug.Log($"解密后:{decryptedValue}");
        
        // 输出:
        // 原始值:100
        // 加密后:某个随机的大数字(每次不同)
        // 解密后:100
        
        Debug.Log(originalValue == decryptedValue ? "✓ 加密解密成功" : "✗ 加密解密失败");
    }

    /// <summary>
    /// 测试玩家数据加密
    /// </summary>
    private void TestPlayerEncryption()
    {
        Debug.Log("=== 测试玩家数据加密 ===");
        
        GamePlayer player = new GamePlayer();
        
        // 设置玩家属性
        player.Level = 10;
        player.Exp = 1000;
        player.Gold = 5000;
        player.Diamond = 100;
        
        Debug.Log($"玩家等级:{player.Level}");
        Debug.Log($"玩家经验:{player.Exp}");
        Debug.Log($"玩家金币:{player.Gold}");
        Debug.Log($"玩家钻石:{player.Diamond}");
        
        // 模拟多次读写
        player.Gold += 1000;
        Debug.Log($"增加金币后:{player.Gold}");
    }
}

/// <summary>
/// 游戏玩家数据(加密保护)
/// </summary>
public class GamePlayer
{
    private int encryptedLevel;
    private int encryptedExp;
    private int encryptedGold;
    private int encryptedDiamond;
    
    private int key;

    public GamePlayer()
    {
        key = EncryptionUtil.GetRandomKey();
    }

    public int Level
    {
        get { return EncryptionUtil.UnLockValue(encryptedLevel, key); }
        set { encryptedLevel = EncryptionUtil.LockValue(value, key); }
    }

    public int Exp
    {
        get { return EncryptionUtil.UnLockValue(encryptedExp, key); }
        set { encryptedExp = EncryptionUtil.LockValue(value, key); }
    }

    public int Gold
    {
        get { return EncryptionUtil.UnLockValue(encryptedGold, key); }
        set { encryptedGold = EncryptionUtil.LockValue(value, key); }
    }

    public int Diamond
    {
        get { return EncryptionUtil.UnLockValue(encryptedDiamond, key); }
        set { encryptedDiamond = EncryptionUtil.LockValue(value, key); }
    }
}

加密模块进阶优化

当前实现的问题:

  1. 加密强度较低:异或加密对专业破解者来说不够强
  2. 密钥管理简单:只有一个密钥,如果密钥泄露,所有数据都暴露
  3. 不支持字符串:只能加密int和long类型

进阶优化建议:

using UnityEngine;
using System.Text;

/// <summary>
/// 增强型加密工具类
/// </summary>
public class AdvancedEncryptionUtil
{
    /// <summary>
    /// 加密字符串
    /// </summary>
    public static string LockString(string value, int key)
    {
        if (string.IsNullOrEmpty(value))
            return value;
        
        byte[] bytes = Encoding.UTF8.GetBytes(value);
        for (int i = 0; i < bytes.Length; i++)
        {
            bytes[i] = (byte)(bytes[i] ^ (key % 256));
        }
        
        return System.Convert.ToBase64String(bytes);
    }

    /// <summary>
    /// 解密字符串
    /// </summary>
    public static string UnLockString(string value, int key)
    {
        if (string.IsNullOrEmpty(value))
            return value;
        
        try
        {
            byte[] bytes = System.Convert.FromBase64String(value);
            for (int i = 0; i < bytes.Length; i++)
            {
                bytes[i] = (byte)(bytes[i] ^ (key % 256));
            }
            return Encoding.UTF8.GetString(bytes);
        }
        catch
        {
            return value;
        }
    }

    /// <summary>
    /// 加密float类型
    /// </summary>
    public static float LockFloat(float value, int key)
    {
        // 将float转换为int进行加密
        int intValue = System.BitConverter.ToInt32(BitConverter.GetBytes(value), 0);
        int encrypted = EncryptionUtil.LockValue(intValue, key);
        byte[] bytes = BitConverter.GetBytes(encrypted);
        return BitConverter.ToSingle(bytes, 0);
    }

    /// <summary>
    /// 解密float类型
    /// </summary>
    public static float UnLockFloat(float value, int key)
    {
        // 将加密的float转换为int进行解密
        int intValue = System.BitConverter.ToInt32(BitConverter.GetBytes(value), 0);
        int decrypted = EncryptionUtil.UnLockValue(intValue, key);
        byte[] bytes = BitConverter.GetBytes(decrypted);
        return BitConverter.ToSingle(bytes, 0);
    }
}

多密钥管理:

using UnityEngine;

/// <summary>
/// 多密钥加密数据
/// 为每个属性使用不同的密钥
/// </summary>
public class SecurePlayerData
{
    // 每个属性使用不同的密钥
    private int key1;
    private int key2;
    private int key3;
    
    private int encryptedHp;
    private int encryptedAtk;
    private int encryptedDef;

    public SecurePlayerData()
    {
        // 初始化多个密钥
        key1 = EncryptionUtil.GetRandomKey();
        key2 = EncryptionUtil.GetRandomKey();
        key3 = EncryptionUtil.GetRandomKey();
    }

    public int HP
    {
        get { return EncryptionUtil.UnLockValue(encryptedHp, key1); }
        set { encryptedHp = EncryptionUtil.LockValue(value, key1); }
    }

    public int Atk
    {
        get { return EncryptionUtil.UnLockValue(encryptedAtk, key2); }
        set { encryptedAtk = EncryptionUtil.LockValue(value, key2); }
    }

    public int Def
    {
        get { return EncryptionUtil.UnLockValue(encryptedDef, key3); }
        set { encryptedDef = EncryptionUtil.LockValue(value, key3); }
    }
}

测试和使用

完整的测试示例:

using UnityEngine;

/// <summary>
/// 加密模块完整测试
/// </summary>
public class EncryptionCompleteTest : MonoBehaviour
{
    void Start()
    {
        // 测试基本加密解密
        TestBasicEncryption();
        
        // 测试玩家数据加密
        TestPlayerDataEncryption();
        
        // 测试多次读写
        TestMultipleReadWrite();
        
        // 测试不同对象
        TestMultipleObjects();
    }

    /// <summary>
    /// 测试基本加密解密
    /// </summary>
    private void TestBasicEncryption()
    {
        Debug.Log("=== 测试基本加密解密 ===");
        
        int[] testValues = { 0, 1, 100, 999, 10000 };
        int key = 123;
        
        foreach (int originalValue in testValues)
        {
            int encrypted = EncryptionUtil.LockValue(originalValue, key);
            int decrypted = EncryptionUtil.UnLockValue(encrypted, key);
            
            Debug.Log($"原始: {originalValue} -> 加密: {encrypted} -> 解密: {decrypted}");
            
            if (originalValue != decrypted)
            {
                Debug.LogError($"加密解密失败!原始值: {originalValue}, 解密值: {decrypted}");
            }
        }
        
        Debug.Log("基本加密解密测试完成");
    }

    /// <summary>
    /// 测试玩家数据加密
    /// </summary>
    private void TestPlayerDataEncryption()
    {
        Debug.Log("=== 测试玩家数据加密 ===");
        
        Player player = new Player();
        player.HP = 100;
        player.Atk = 50;
        player.Money = 1000;
        
        Debug.Log($"玩家HP: {player.HP}(正确值应该是100)");
        Debug.Log($"玩家Atk: {player.Atk}(正确值应该是50)");
        Debug.Log($"玩家Money: {player.Money}(正确值应该是1000)");
        
        // 验证值是否正确
        bool success = player.HP == 100 && player.Atk == 50 && player.Money == 1000;
        Debug.Log(success ? "✓ 玩家数据加密测试通过" : "✗ 玩家数据加密测试失败");
    }

    /// <summary>
    /// 测试多次读写
    /// </summary>
    private void TestMultipleReadWrite()
    {
        Debug.Log("=== 测试多次读写 ===");
        
        Player player = new Player();
        
        // 多次读写操作
        for (int i = 0; i < 10; i++)
        {
            player.HP = 100 - i;
            int readValue = player.HP;
            
            if (readValue != 100 - i)
            {
                Debug.LogError($"多次读写失败!期望: {100 - i}, 实际: {readValue}");
                return;
            }
        }
        
        Debug.Log("✓ 多次读写测试通过");
    }

    /// <summary>
    /// 测试不同对象
    /// </summary>
    private void TestMultipleObjects()
    {
        Debug.Log("=== 测试不同对象 ===");
        
        Player player1 = new Player();
        Player player2 = new Player();
        
        // 设置相同的初始值
        player1.HP = 100;
        player2.HP = 100;
        
        // 应该都能正确读取
        bool success = player1.HP == 100 && player2.HP == 100;
        
        if (success)
        {
            Debug.Log("✓ 不同对象加密测试通过");
            Debug.Log($"玩家1 HP: {player1.HP}");
            Debug.Log($"玩家2 HP: {player2.HP}");
        }
        else
        {
            Debug.LogError("✗ 不同对象加密测试失败");
        }
    }
}

进阶和拓展

进阶优化建议:

  1. AES加密:对于高价值数据使用AES等高级加密算法
  2. 密钥派生:使用PBKDF2等算法派生更复杂的密钥
  3. 数据完整性校验:使用HMAC等机制验证数据未被篡改
  4. 混淆保护:对关键代码进行混淆,防止逆向工程
  5. 服务端校验:关键数据在服务端进行二次校验
  6. 反调试机制:检测调试器和修改器
  7. 运行时加密:在运行时动态生成和销毁密钥

注意事项:

  1. 性能影响:加密解密会有一定的性能开销
  2. 不适用于所有数据:频繁更新的数据(如帧率)不适合加密
  3. 内存占用:加密数据和密钥都会占用额外内存
  4. 不能完全防止:专业的破解者仍然可能通过内存分析破解
  5. 密钥管理:密钥的生成和存储需要谨慎处理

最佳实践:

  1. 只加密关键数据:如金币、钻石、血量等重要属性
  2. 配合服务端校验:本地加密要配合服务端的数据校验
  3. 定期更换密钥:在合适的时机更换加密密钥
  4. 多层防护:加密 + 校验 + 混淆 + 反调试
  5. 性能权衡:根据游戏类型和需求选择合适的加密强度

12.2 知识点代码

EncryptionUtil.cs(加密工具类 - 最终版本)

using UnityEngine;

/// <summary>
/// 加密工具类
/// 主要提供加密需求
/// </summary>
public class EncryptionUtil
{
    /// <summary>
    /// 获取随机密钥
    /// 生成1-10004之间的随机整数
    /// </summary>
    /// <returns>返回随机密钥</returns>
    public static int GetRandomKey()
    {
        return Random.Range(1, 10000) + 5;
    }

    /// <summary>
    /// 加密int数据
    /// 使用异或加密算法进行多层加密
    /// </summary>
    /// <param name="value">要加密的值</param>
    /// <param name="key">加密密钥</param>
    /// <returns>加密后的值</returns>
    public static int LockValue(int value, int key)
    {
        // 主要采用异或加密
        value = value ^ (key % 9);
        value = value ^ 0xADAD;
        value = value ^ (1 << 5);
        value += key;
        return value;
    }

    /// <summary>
    /// 加密long数据
    /// 使用异或加密算法进行多层加密
    /// </summary>
    /// <param name="value">要加密的值</param>
    /// <param name="key">加密密钥</param>
    /// <returns>加密后的值</returns>
    public static long LockValue(long value, int key)
    {
        // 主要采用异或加密
        value = value ^ (key % 9);
        value = value ^ 0xADAD;
        value = value ^ (1 << 5);
        value += key;
        return value;
    }

    /// <summary>
    /// 解密int数据
    /// 逆向执行加密操作还原数据
    /// </summary>
    /// <param name="value">要解密的值</param>
    /// <param name="key">解密密钥</param>
    /// <returns>解密后的值</returns>
    public static int UnLockValue(int value, int key)
    {
        // 有可能还没有加密过 没有初始化过的数据 直接想要获取 那么就不用解密了
        // 这种时候数值肯定是0
        if (value == 0)
            return value;
        
        // 逆向操作还原数据(操作顺序相反)
        value -= key;
        value = value ^ (1 << 5);
        value = value ^ 0xADAD;
        value = value ^ (key % 9);
        return value;
    }

    /// <summary>
    /// 解密long数据
    /// 逆向执行加密操作还原数据
    /// </summary>
    /// <param name="value">要解密的值</param>
    /// <param name="key">解密密钥</param>
    /// <returns>解密后的值</returns>
    public static long UnLockValue(long value, int key)
    {
        // 有可能还没有加密过 没有初始化过的数据 直接想要获取 那么就不用解密了
        // 这种时候数值肯定是0
        if (value == 0)
            return value;
        
        // 逆向操作还原数据(操作顺序相反)
        value -= key;
        value = value ^ (1 << 5);
        value = value ^ 0xADAD;
        value = value ^ (key % 9);
        return value;
    }
}

SecurePlayer.cs(加密玩家数据类)

using UnityEngine;

/// <summary>
/// 带加密保护的玩家数据类
/// </summary>
public class SecurePlayer
{
    #region 私有字段

    /// <summary>
    /// 加密密钥
    /// </summary>
    private int key;

    /// <summary>
    /// 加密后的血量
    /// </summary>
    private int encryptedHp;

    /// <summary>
    /// 加密后的攻击力
    /// </summary>
    private int encryptedAtk;

    /// <summary>
    /// 加密后的防御力
    /// </summary>
    private int encryptedDef;

    /// <summary>
    /// 加密后的金币
    /// </summary>
    private int encryptedGold;

    #endregion

    #region 构造函数

    /// <summary>
    /// 构造函数
    /// 初始化时生成随机密钥
    /// </summary>
    public SecurePlayer()
    {
        key = EncryptionUtil.GetRandomKey();
        Debug.Log($"玩家密钥生成:{key}");
    }

    #endregion

    #region 公开属性

    /// <summary>
    /// 血量(加密属性)
    /// </summary>
    public int HP
    {
        get { return EncryptionUtil.UnLockValue(encryptedHp, key); }
        set { encryptedHp = EncryptionUtil.LockValue(value, key); }
    }

    /// <summary>
    /// 攻击力(加密属性)
    /// </summary>
    public int Atk
    {
        get { return EncryptionUtil.UnLockValue(encryptedAtk, key); }
        set { encryptedAtk = EncryptionUtil.LockValue(value, key); }
    }

    /// <summary>
    /// 防御力(加密属性)
    /// </summary>
    public int Def
    {
        get { return EncryptionUtil.UnLockValue(encryptedDef, key); }
        set { encryptedDef = EncryptionUtil.LockValue(value, key); }
    }

    /// <summary>
    /// 金币(加密属性)
    /// </summary>
    public int Gold
    {
        get { return EncryptionUtil.UnLockValue(encryptedGold, key); }
        set { encryptedGold = EncryptionUtil.LockValue(value, key); }
    }

    #endregion
}

EncryptionModuleTest.cs(加密模块测试)

using UnityEngine;

/// <summary>
/// 加密模块完整测试
/// </summary>
public class EncryptionModuleTest : MonoBehaviour
{
    #region 生命周期

    void Start()
    {
        Debug.Log("=== 加密模块测试 ===");
        
        // 测试基本加密解密
        TestBasicEncryption();
        
        // 测试玩家数据加密
        TestPlayerDataEncryption();
        
        // 测试多次读写
        TestMultipleReadWrite();
        
        // 测试不同对象
        TestMultipleObjects();
    }

    #endregion

    #region 测试方法

    /// <summary>
    /// 测试基本加密解密
    /// </summary>
    private void TestBasicEncryption()
    {
        Debug.Log("--- 测试1:基本加密解密 ---");
        
        int[] testValues = { 0, 1, 100, 999, 10000, -100 };
        int key = EncryptionUtil.GetRandomKey();
        
        Debug.Log($"使用密钥:{key}");
        
        foreach (int originalValue in testValues)
        {
            int encrypted = EncryptionUtil.LockValue(originalValue, key);
            int decrypted = EncryptionUtil.UnLockValue(encrypted, key);
            
            Debug.Log($"原始: {originalValue} -> 加密: {encrypted} -> 解密: {decrypted}");
            
            if (originalValue != decrypted)
            {
                Debug.LogError($"✗ 加密解密失败!原始值: {originalValue}, 解密值: {decrypted}");
            }
        }
        
        Debug.Log("✓ 基本加密解密测试完成");
    }

    /// <summary>
    /// 测试玩家数据加密
    /// </summary>
    private void TestPlayerDataEncryption()
    {
        Debug.Log("--- 测试2:玩家数据加密 ---");
        
        SecurePlayer player = new SecurePlayer();
        
        // 设置玩家属性
        player.HP = 100;
        player.Atk = 50;
        player.Def = 30;
        player.Gold = 1000;
        
        // 读取并验证
        bool success = player.HP == 100 && player.Atk == 50 && 
                       player.Def == 30 && player.Gold == 1000;
        
        if (success)
        {
            Debug.Log("✓ 玩家数据加密测试通过");
            Debug.Log($"玩家HP: {player.HP}");
            Debug.Log($"玩家Atk: {player.Atk}");
            Debug.Log($"玩家Def: {player.Def}");
            Debug.Log($"玩家Gold: {player.Gold}");
        }
        else
        {
            Debug.LogError("✗ 玩家数据加密测试失败");
        }
    }

    /// <summary>
    /// 测试多次读写
    /// </summary>
    private void TestMultipleReadWrite()
    {
        Debug.Log("--- 测试3:多次读写 ---");
        
        SecurePlayer player = new SecurePlayer();
        player.HP = 100;
        
        // 模拟多次读写操作
        for (int i = 0; i < 10; i++)
        {
            player.HP = 100 - i;
            int readValue = player.HP;
            
            if (readValue != 100 - i)
            {
                Debug.LogError($"✗ 多次读写失败!期望: {100 - i}, 实际: {readValue}");
                return;
            }
        }
        
        Debug.Log("✓ 多次读写测试通过");
    }

    /// <summary>
    /// 测试不同对象
    /// </summary>
    private void TestMultipleObjects()
    {
        Debug.Log("--- 测试4:不同对象 ---");
        
        SecurePlayer player1 = new SecurePlayer();
        SecurePlayer player2 = new SecurePlayer();
        
        // 设置相同的初始值
        player1.HP = 100;
        player1.Gold = 500;
        
        player2.HP = 100;
        player2.Gold = 500;
        
        // 验证每个对象的数据
        bool success = player1.HP == 100 && player2.HP == 100 &&
                       player1.Gold == 500 && player2.Gold == 500;
        
        if (success)
        {
            Debug.Log("✓ 不同对象加密测试通过");
            Debug.Log($"玩家1 HP: {player1.HP}, Gold: {player1.Gold}");
            Debug.Log($"玩家2 HP: {player2.HP}, Gold: {player2.Gold}");
        }
        else
        {
            Debug.LogError("✗ 不同对象加密测试失败");
        }
    }

    #endregion
}

EncryptionUsageExample.cs(加密模块使用示例)

using UnityEngine;

/// <summary>
/// 加密模块实际使用示例
/// </summary>
public class EncryptionUsageExample : MonoBehaviour
{
    private SecurePlayer player;
    
    void Start()
    {
        Debug.Log("=== 加密模块使用示例 ===");
        
        // 初始化玩家
        InitializePlayer();
        
        // 演示各种操作
        DemonstrateOperations();
    }

    /// <summary>
    /// 初始化玩家
    /// </summary>
    private void InitializePlayer()
    {
        player = new SecurePlayer();
        player.HP = 100;
        player.Atk = 50;
        player.Def = 30;
        player.Gold = 1000;
        
        Debug.Log("玩家初始化完成");
        Debug.Log($"初始HP: {player.HP}, Atk: {player.Atk}, Def: {player.Def}, Gold: {player.Gold}");
    }

    /// <summary>
    /// 演示各种操作
    /// </summary>
    private void DemonstrateOperations()
    {
        // 1. 增加金币
        Debug.Log("--- 操作1:增加金币 ---");
        player.Gold += 500;
        Debug.Log($"增加500金币后:{player.Gold}");
        
        // 2. 扣除血量
        Debug.Log("--- 操作2:扣除血量 ---");
        player.HP -= 20;
        Debug.Log($"扣除20血量后:{player.HP}");
        
        // 3. 升级攻击力
        Debug.Log("--- 操作3:升级攻击力 ---");
        player.Atk += 10;
        Debug.Log($"增加10攻击力后:{player.Atk}");
        
        // 4. 购买装备(消耗金币和增加防御)
        Debug.Log("--- 操作4:购买装备 ---");
        if (player.Gold >= 300)
        {
            player.Gold -= 300;
            player.Def += 15;
            Debug.Log($"购买装备消耗300金币,增加15防御");
            Debug.Log($"当前金币: {player.Gold}, 当前防御: {player.Def}");
        }
    }
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏