对AssetBundle进行加密(Unity3D)

对ab进行加密,防止资源被轻易盗取;网上有很多种加密,实在太废力了;以下加密只能防小白使用工具盗取;废话不多说

public static AssetBundleManifest BuildAssetBundles(string outputPath, BuildAssetBundleOptions assetBundleOptions, BuildTarget targetPlatform);//打包
public static AssetBundle LoadFromFile(string path, uint crc, ulong offset);//load资源
public static AssetBundleCreateRequest LoadFromFileAsync(string path, uint crc, ulong offset);//async load资源
  • 1现象:对打包出来的ab包,使用工具AssetStudio能很简单的被解导出来,这是我们不想见到
  • 2原理:对BuildPipeline.BuildAssetBundles(…)生成文件之后
    • 加密:对文件对写入一些空字符,达到offset偏移咯
    • 解密:使用AssetBundle.LoadFromFile()有offset方法进行load出来:偏移多少就offset多少

以下是我工程的代码,原理已贴出,若老司机可以忽略以下

if (GUILayout.Button("生成AB包", GUILayout.Height(40)))生成文件
{
//.....略

//想过用byte还原回去,能还原;但还原之后,若不删除原ab包 unity生成会闪退    建议生成AB时删除原目录或手动解压压缩回去(原先未加密前先压缩一下)
//全体重新打ab包造成时间长一点
    var filepath = Application.dataPath.Replace("Unity/Assets", "") + "Release/" + this.platformType.ToString() + "/StreamingAssets";
    if (Directory.Exists(filepath))
        Directory.Delete(filepath, true);

   BuildPipeline.BuildAssetBundles(fold, buildAssetBundleOptions, buildTarget);
}
//生成文件之后,加密
if (GUILayout.Button("给AssetBundle加密(别重复点击)", GUILayout.Height(40)))
{
    var filepath = Application.dataPath.Replace("Unity/Assets", "") + "Release/Android/StreamingAssets";
    var files = Directory.GetFiles(filepath, "*.*");
    for (int i = 0; i < files.Length; i++)
    {
        if (files[i].Contains("StreamingAssets.manifest") || files[i].Contains("Version.txt"))
        {
        }
        else
        {
            byte[] oldData = File.ReadAllBytes(files[i]);
            int newOldLen = 128 + oldData.Length;//定死了,128个空byte
            var newData = new byte[newOldLen];
            for (int tb = 0; tb < oldData.Length; tb++)
            {
                newData[128 + tb] = oldData[tb];
            }
            FileStream fs = File.OpenWrite(files[i]);//打开写入进去
            fs.Write(newData, 0, newOldLen);
            fs.Close();
        }
    }
}

//解密加载
//找到自己loadFormFileAsync(path)
  if (Define.IsAsync && Define.IsILRuntime)//异步
    {
        this.request = AssetBundle.LoadFromFileAsync(path, 0, 128);//定死的,128字节
    }
    else
    {
        this.request = AssetBundle.LoadFromFileAsync(path);
    }
    
    
   if (Define.IsAsync && Define.IsILRuntime)//同步
     {
         assetBundle = AssetBundle.LoadFromFile(p, 0, 128);
     }
     else
     {
         assetBundle = AssetBundle.LoadFromFile(p);
     }

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值