UFL11——加密工具模块
UFL11——加密工具模块
前置知识点:数据加密、异或加密 相关知识点(数据持久化之2进制中)
加密工具模块 主要作用
在游戏开发中,为了防止玩家利用修改器等工具修改游戏数据,我们往往会加入数据加密功能
主要作用就是提高游戏安全性,防止被修改,而加密工具模块就是为了方便数据加密而存在的
加密工具模块的主要作用,就是将存储在内存中的数据进行加密,避免玩家利用修改器查找内存中数据进行修改
加密工具模块 基本原理
- 加密:将原本存储在内存中的值进行加密后变换为另一个值存储在内存中
- 解密:将内存中存储的值进行解密后得到原始值
- 加密算法:异或加密
我们将新建一个加密工具类,主要提供以下方法:
- 获取随机密钥 方法
- 加密数据 方法
- 解密数据 方法
只要在需要加密的地方进行相关方法调用即可
加密工具模块 具体实现
-
获取随机密钥 方法
如何获取随机密钥是可以自定义的
1
2
3
4
5
6
7
8/// <summary>
/// 获取随机密钥
/// </summary>
/// <returns>生成的密钥</returns>
public static int GetRandomKey()
{
return Random.Range(0, 10000);
} -
加密数据 方法
如何加密和解密数据可以是自定义的
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;
} -
解密数据 方法
值得一提的是,解密数据时,有可能传入的数值是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 | public class TestPlayer |
1 | public class Main : MonoBehaviour |
通过对获取hp
和设置hp
语句进行断点,我们可以查看此时内存内的这个值是否被加密了
运行程序,查看内存可发现内存内存储的hp
值和我们设置的值不一致,可见加密是正常工作的
但是输出的获取到的值是和我们设置的是一致的,可见解密是正常工作的
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 文KRIFE齐的博客!