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

Unity项目开发中如何做资源加密

时间:2023-11-08 15:01:31浏览次数:36  
标签:加密 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循环遍历里面的打包后的每个资源,然后调用进行加密。        

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); // 触发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/rainy1unity/p/17817419.html

相关文章

  • Unity架构师必备的开源库,让你3天搭建商用游戏框架
    现在Unity的相关技术已经都非常常熟了,如果你的技术能力与阅历够,搭建一个商用的游戏框架,你只需要3天的时间。今天给大家分享一个Unity老鸟3天能搭建一个自己的商用框架的几个必备的开源库,方便大家学习与使用,同时学习这些有前途的开源库也能让你在公司里面游刃有余。 1:搭建商用......
  • Unity HybridCLR(wolong)/huatuo系列
    Lua,ILRuntime,HybridCLR(wolong),huatuo热更对比分析 这两年,各种Unity热更新方案如雨后春笋般出来了,今天来写篇文章来对比一下Unity各大热更新方案的优缺点。目前主流的Unity热更新的方案有:  Lua系解决方案:内置一个Lua虚拟机,做好UnityEngine与C#框架的Lua导出。典型的......
  • 有哪些app开发工具支持跨平台开发?
    跨平台开发是指使用一种或多种工具和技术来开发可以在多个平台上运行的应用程序。以下是一些支持跨平台开发的APP开发工具:Flutter:由Google开发的UI工具包,可用于在iOS、Android和Web上构建美观的原生用户界面。使用单一代码库,开发人员可以创建高性能、流畅的应用程序。ReactNative:......
  • 北京教育医疗商城软件开发公司有哪些
    智慧华盛恒辉教育医疗商城软件开发可以包括以下方面:用户注册登录系统:实现用户注册和登录功能,用于识别用户身份,确保用户可以顺利进入商城。商品展示系统:展示商城中的商品信息,包括商品名称、价格、描述、图片等,方便用户浏览和选择。购物车系统:实现用户将商品添加到购......
  • Unity性能调优技术集锦
    性能调优,一直是游戏上线之前的很重要的一个环节,游戏帧率过低,手机发烫,低端机上跑不起来等,这些都需要来做优化,今天我们来给大家分享Unity做性能调优的常用技术手段。 性能调优的指导思想 接触过很多刚做性能调优的小伙伴,他们做性能调优最大的问题就是缺乏一个做性能优化......
  • Unity 编辑器UI 杂记
     用 rootVisualElement方法绘制按钮和用 GUILayout.Button绘制按钮混用的案例usingSystem.Collections;usingSystem.Collections.Generic;usingNUnit.Framework;usingUnityEditor;usingUnityEngine;usingUnityEngine.UIElements;publicclassMyTestPanel:......
  • android短视频开发,uniapp页面滚动条到指定位置
    android短视频开发,uniapp页面滚动条到指定位置#html指定位置<viewclass="gap_body_position"></view> #js执行this.$nextTick(()=>{  //一定要用nextTickuni.pageScrollTo({duration:300,selector:'.gap_body_position'});})​以上就是android短视频开发,uniapp页......
  • WPF 使用 CommunityToolkit.Mvvm
    参考文档: IntroductiontotheMVVMToolkit-CommunityToolkitsfor.NET|MicrosoftLearn它是一个现代化,快速和模块化的MVVM库,对应用程序的结构或编译规范没有严格的限制。NuGet安装包搜索:CommunityToolkit.Mvvm导入usingCommunityToolkit.Mvvm;使用ObservableObjectpubli......
  • 某音用SSL证书上了一把“安全锁”,加密保护网络传输数据安全
    依照《网络安全法》、《数据安全法》等相关法律法规,网络运营者应当按照网络安全等级保护制度的要求,采用数据加密等措施来防止网络数据泄露或者被窃取、篡改。某音作为头部的音乐创意短视频社交平台,每天都有数以亿计的用户在上面观看、发布视频,而这会产生大量包含个人账号、密码等用......
  • Unity游戏排行榜制作与性能优化
    游戏排行榜是一个很重要的功能,在弱联网的单机游戏与网络游戏中排行榜都是非常重要的,今天我们来详细的讲解游戏排行榜的制作方案,主要有4个点:(1) 游戏排行榜排序算法核心算法实现;(2) 游戏排行服务器如何制作;(3) Unity客户端如何对接与请求排行榜数据;(4) Unity如何优化......