UFL11——加密工具模块

前置知识点:数据加密、异或加密 相关知识点(数据持久化之2进制中)

加密工具模块 主要作用

在游戏开发中,为了防止玩家利用修改器等工具修改游戏数据,我们往往会加入数据加密功能
主要作用就是提高游戏安全性,防止被修改,而加密工具模块就是为了方便数据加密而存在的

加密工具模块的主要作用,就是将存储在内存中的数据进行加密,避免玩家利用修改器查找内存中数据进行修改

加密工具模块 基本原理

  • 加密:将原本存储在内存中的值进行加密后变换为另一个值存储在内存中
  • 解密:将内存中存储的值进行解密后得到原始值
  • 加密算法:异或加密

我们将新建一个加密工具类,主要提供以下方法:

  1. 获取随机密钥 方法
  2. 加密数据 方法
  3. 解密数据 方法

只要在需要加密的地方进行相关方法调用即可

加密工具模块 具体实现

  1. 获取随机密钥 方法

    如何获取随机密钥是可以自定义的

    1
    2
    3
    4
    5
    6
    7
    8
    /// <summary>
    /// 获取随机密钥
    /// </summary>
    /// <returns>生成的密钥</returns>
    public static int GetRandomKey()
    {
    return Random.Range(0, 10000);
    }
  2. 加密数据 方法

    如何加密和解密数据可以是自定义的

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    /// <summary>
    /// 加密数据
    /// </summary>
    /// <param name="value">要加密的值</param>
    /// <param name="key">密钥</param>
    /// <returns>加密后的值</returns>
    public static int LockValue(int value, int key)
    {
    //主要采用异或加密,在密钥的基础上进行异或运算,可以加上部分写死的内容,这样外部即使得知密钥也不能解密
    //加密解密的步骤是完全可以自定义的
    value ^= (key % 9);
    value ^= 0xADAD;
    value ^= (1 << 5);
    value += key;
    return value;
    }
  3. 解密数据 方法

    值得一提的是,解密数据时,有可能传入的数值是0,如果是0,
    则很可能这个值是未加密的未初始化数据,此时我们不能去做解密

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    /// <summary>
    /// 解密数据
    /// </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 ^= (1 << 5);
    value ^= 0xADAD;
    value ^= (key % 9);
    return value;
    }

使用示例

假设要加密这个类的hp​在内存内存储的值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class TestPlayer
{
private int hp = 0;
private int atk;

private readonly int key;

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

public int HP
{
get
{
return EncryptionUtil.UnLockValue(hp, key);
}
set
{
hp = EncryptionUtil.LockValue(value, key);
}
}
}
1
2
3
4
5
6
7
8
9
public class Main : MonoBehaviour
{
void Start()
{
TestPlayer player = new TestPlayer();
player.HP = 100;
print(player.HP);
}
}

通过对获取hp​和设置hp​语句进行断点,我们可以查看此时内存内的这个值是否被加密了

image

运行程序,查看内存可发现内存内存储的hp​值和我们设置的值不一致,可见加密是正常工作的

image

但是输出的获取到的值是和我们设置的是一致的,可见解密是正常工作的

image