首页 > 其他分享 >Unity资源管理系列:Unity项目开发中如何做资源加密

Unity资源管理系列:Unity项目开发中如何做资源加密

时间:2024-02-18 10:12:10浏览次数:31  
标签:加密 int 解密 Unity array 资源管理 资源

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

(1) 游戏资源加密如何选择加密算法;

(2) Assetsbundle资源包的加密与解密;

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

游戏资源包加密的第一件事情就是选一个什么样的加密/解密算法,比较不容易被人破解。我们如何来选择呢?很遗憾的告诉大家,没有任何一个保险的加密解密算法是安全的。杠精第一时间就会来反驳,这怎么可能,我加密了他怎么破解?游戏资源加密注定了加密算法不能用太耗时的加密算法。接下来我们来看下不同加密算法是如何被破解的。

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

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

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

源数据1110 0001, 密钥为 00101000;

加密数据: 1110 0001 ^ 00101000 = 1100 1001

解密数据: 1100 1001 ^ 00101000 = 1110 0001

所有从上面分析来看想要不被破解,几乎是很难,就看破解的代价。你这个游戏是否值得。一般我们的目标就是不要让人通过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调用,来解密数据。
}

今天的分享就到这里了,可以进入学习小组 一起交流游戏开发

标签:加密,int,解密,Unity,array,资源管理,资源
From: https://www.cnblogs.com/bycw/p/18018826

相关文章

  • Unity Audio System概要
    Unity的AudioSystem给我们提供了一整套的游戏音频处理解决方案,接下来我们对UnityAudioSystem进行简单的讲解。首先让我们来了解一下UnityAudioSystem包含了哪些重要的组成部分。AudioClip:这个是Unity存放外部音频资源的容器,可以根据我们的需要将外部导入的音频资源进行粗处......
  • 【Unity】消息系统
    介绍封装的消息机制使用注册消息Reg(MessageTypemessageType,MessageDelHandlehandle);messageType :注册消息类型handle :消息传入时回调方法(该方法需拥有参数Message)注销消息UnReg(MessageTypemessageType,MessageDelHandlehandle);messageType :注销消息类型......
  • Unity手机游戏性能优化系列:针对CPU端的性能调优
    做手机游戏开发的时,经常会遇到手机游戏的性能问题,手机游戏的性能问题可能有很多的方面,今天我们从CPU调优的角度来給大家介绍一下常用的CPU调优的一些经验和手段。这些经验和手段都有可能随着时间与环境的变化改变而改变,具体还是要以实际的为准,先定位性能问题,再上具体的手段。接下......
  • 【密钥】对称密钥、非对称密钥、加密与解密、签名与验证
     在加密和解密的过程中,密钥是用于保护数据安全的一种工具。它就像一把钥匙,只有拥有正确的密钥才能够解锁数据。 对于同一份数据,使用不同的密钥进行加密,会得到不同的加密结果。对称密钥加密算法中,加密和解密使用的是同一把密钥,常见的对称密钥加密算法有AES、DES等;而非对称密......
  • Unity资源管理系列:Unity 框架如何做好资源管理
    Unity资源管理需求分析作为架构师,在开始动手之前,先分析清楚需求,你才能设计出合理的方案,我们来分析一下Unity资源管理都有哪些需求,把需求想清楚了,设计是自然而然的事情。Unity资源管理主要需求:1:为开发与正式发布提供资源的加载/卸载;2:方便远程更新资源。3:带资源与不带资源......
  • Unity 类胡闹厨房游戏 KitchenChaos 阶段1整理记录
    原教程地址:https://youtu.be/AmGSEH7QcDg部分代码:usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;publicclassPlayerAnimator:MonoBehaviour{privateconststringIS_WALKING="IsWalking";[SerializeField]priv......
  • 【记录】 unity插件 Addressables
    介绍Addressables是Unity官方推出的用于资源热更的系统,可在PackageManager里面下载。安装可在PackageManager里面下载、安装即可使用配置Addressables配置使用基础Addressables使用远程分发Addressables远程分发......
  • 利用RSA加密打造强大License验证,确保软件正版合法运行
     概述:C#软件开发中,License扮演着确保软件合法使用的重要角色。采用RSA非对称加密方案,服务端生成带签名的License,客户端验证其有效性,从而实现对软件的授权与安全保障。License应用场景:License(许可证)在C#软件开发中被广泛应用,以确保软件在合法授权的环境中运行。常见场景包括......
  • 非对称加密的经典案例-ssh密码登录/免密登录
    我在给云服务器配置本地电脑免密登录的过程中,学习了一下SSH免密登录的实现原理。对SSH中输入密码登录和免密登录的原理根据自己的理解做了如下笔记,分享给大家希望能有所帮助。1.对称加密对称加密是加密过程中只有一个密钥,加密解密都只用这个密钥。加密通讯至少要有一对通讯对......
  • day18_系统资源管理
    今日内容英文单词的认识,需要大家自己逐步锻炼了,以后适当的加在考试题中作为练习关于作业,昨日知识,以后大家就把不会的作业题,发在各自小组,我来课下解决关于后台符&,如何用,才是真的实现,安全,可靠的后台运行。可以理解为,无论是用户正常注销登录如logout,如exit。-还是异常的......