unity 资源加密解密

文章探讨了Unity游戏中资源容易被反编译和破解的问题,提出了两种加密解密算法:标准库加密和自定义二进制加密。尽管这些方法可能被破解,但可以增加破解难度。文章详细介绍了如何在打包Assetsbundle资源时进行加密,并在运行时解密,包括自定义MyStream类以实现读写时的加密解密操作。
摘要由CSDN通过智能技术生成

Unity的游戏很容易被人反编译出来,然后再重新打包发布,把自己辛辛苦苦开发的游戏,抄写的一丝不挂。很多项目要求要做好资源加密,Unity中如何做好资源加密呢?加密算法+资源打包整合思路:

游戏资源包如何选择加密算法

(1) 使用标准库实现的加密解密算法,比如使用encrypt加密/解密算法。这里有个问题,我们会有一个密钥用来解密,密钥一般游戏都写死到代码里。这种破解太简单了,密钥写死在代码里,基本都是字符串等,静态分析代码找到密钥对应的字符串,有了密钥,你用的是标准库,一下加密资源就破解了,分分钟你的资源就被破解了。

(2) 使用自己实现的加密解密算法,比如,采用二进制亦或来做加密解密,比如,加密定一个二进制掩码mask, 让每个字节都异或这个mask,得到一个新的数据,这样资源就不能被直接识别出来,使用资源得时候,再把加密数据异或一次mask在解密回来到项目中使用。这种破解稍微蛮烦写,需要自己反编译你的解密代码,同时还要找到你的解密密钥key。但是本质也比较容易破解。

加密/解密算法示意如下:

所有从上面分析来看想要不被破解,几乎是很难,就看破解的代价。你这个游戏是否值得。一般我们的目标就是不要让人通过Unity反编译工具就能直接让我们的游戏直接反编译出Unity项目工程,然后重新编译打包发布就可以了。解密算法要快,注定他不会太复杂,密钥单一的放客户端或是网络,注定能获取到。

Assetsbundle资源包加密解密

分析完加密解密算法以后,接下来我们就来看下如何加密我们的资源,先来介绍第一种方案,打资源包的时候,加密单个的资源, 把加密后的数据打入到资源包。解密的时候,从ab包中读取资源,然后再把资源包里的内容解密开来。具体做法如下:

(1) 新建一个类,继承自FileStream, 重写Read/Write函数。代码如下:

using System.IO;

public class MyStream : FileStream {
    const byte KEY = 40; // 密钥mask: 0010 1000

    public MyStream(string path, FileMode mode, FileAccess access, FileShare share, int bufferSize, bool useAsync) :
                               base(path, mode, access, share, bufferSize, useAsync) {

    }

    public MyStream(string path, FileMode mode) : base(path, mode) {

    }

    // 重载读接口,一边读,一遍解密;
    public override int Read(byte[] array, int offset, int count) {
        var index = base.Read(array, offset, count);

        for (int i = 0 ; i < array.Length; i++) {
            array[i] ^= KEY;
        }
        return index;
    }

    public override void Write(byte[] array, int offset, int count) {
        // 重载写接口,先加密再写入;

        for (int i = 0; i < array.Length; i ++) {
            array[i] ^= KEY;
        }
        base.Write(array, offset, count);
    }
}

(2) 修改ab包打包工具脚本,再对生成的ab包资源加密一次,打包加密脚本如下:

[MenuItem("Tools/BuildAB")]
static void BuildAB()
{
    …
    // for循环遍历里面的打包后的每个资源Ab包,然后调用进行加密。
    foreach (var name in manifest.GetAllAssetBundles())
    {
        var uniqueSalt = Encoding.UTF8.GetBytes(name);
        var data = File.ReadAllBytes(Path.Combine(Application.streamingAssetsPath, name));
        using (var myStream = new MyStream(Path.Combine(Application.streamingAssetsPath, "encypt_" + name),FileMode.Create))
        {
            myStream.Write(data, 0, data.Length); // 触发MyStream中我们重写的write函数的调用, 完成数据加密
        }
    }
    AssetDatabase.Refresh();
}

(3) 解密的时候,读取ab包,使用函数AssetsBundle.LoadFromStream来加载,而这个会触发Stream在Read读数据接口调用,就可以进入我们重载的Read接口,来做解密。代码如下:

var fileStream = new MyStream(Application.streamingAssetsPath + "/encypt_myab.unity3d", FileMode.Open, FileAccess.Read, FileShare.None, 1024 * 4, false))
{
    var myLoadedAssetBundle = AssetBundle.LoadFromStream(fileStream); // 触发MyStream中的Read调用,来解密数据。
}

Unity游戏开发中,JSON(JavaScript Object Notation)是一种常用的轻量级数据交换格式,它将数据序列化为易于阅读和编写的形式。然而,如果你需要对敏感信息如用户账号密码等进行加密后再存储到JSON文件中,可以采取以下步骤: 1. 加密:使用Unity内置的System.Security.Cryptography命名空间提供的算法(如AES、RSA等),对JSON字符串进行加密。例如,你可以创建一个自定义的Encryptor类,封装加密操作。 ```csharp using System.Text.Json; using System.Security.Cryptography; public class Encryptor { public string Encrypt(string jsonData, string encryptionKey) { byte[] encryptedBytes = AESEncryption(jsonData, encryptionKey); return Convert.ToBase64String(encryptedBytes); } private byte[] AESEncryption(string input, string key) { // 实现AES加密逻辑 } } ``` 2. 存储:将加密后的字符串保存到JSON文件中,替换原始明文数据。 3. 解密:读取JSON文件时,先从文件获取加密数据,然后通过相同的密钥和同样的加密算法进行解密。 ```csharp public class Decryptor { public string Decrypt(string encryptedJson, string decryptionKey) { byte[] decryptedBytes = AESDecryption(Convert.FromBase64String(encryptedJson), decryptionKey); return Encoding.UTF8.GetString(decryptedBytes); } private byte[] AESDecryption(byte[] encryptedBytes, string key) { // 实现AES解密逻辑 } } ``` 注意:在实际项目中,你应该妥善管理密钥的安全,避免将其硬编码到代码中。可以考虑使用安全的方式存储和传输密钥,比如环境变量或安全的服务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值