开发文章

C#简单方法实现Unity3d 游戏资源打包加密(图片/XML/TXT等)

本文只是讲述一下过程,采用很简单的打包加密方法,至于需要什么样的加密结果,请大家按照需求去修改,字节偏移、前后颠倒加算法都可以,不过一般无需这么复杂,而且太复杂的加密对于极其追求运行效率的游戏来说,也是一重负担。

 

对于Unity,虽然Unity自身会进行压缩加密,但是其解密算法在网上随处可见,如果自己觉得游戏里面的资料具有保密性质,请对其进行自行加密。

 

打包加密的原理:

1、大家都知道文件都是由字节组成的。

2、一张图片之所以看起来很漂亮,是因为其数据按照一定顺序排列。

漂亮的剑灵妹子

漂亮的剑灵.jpg

我们可以用一个文本编辑器将其打开。

是乱码,不然你还想看到什么呢?

文本编辑器.png

3、如果我们把图片数据打乱,或者在前面加一些很乱的数据,会怎么样呢?

图片数据打乱.png

嗯,图片不显示了。

这很容易理解,就像你看片的时候被打了马赛克嘛。。

仔细想想,为什么打马赛克?

不就是为了保密嘛。。。

 

好的,上面我们就起到了保密-加密功能。

 

4、我又找来一张图片……萌萌哒的。。

一张图片.jpg

同样用一个文本编辑器打开这个图片。

复制所有的内容到第一个图片文件后面。

结果会怎么样?

两个图片会拼在一起吗?

两个图片会拼在一起.png

 

真不幸……

不过这是符合我的主题的。加密嘛,就是要让人看不出来。

 

原理就讲到这里,下面就是代码了。

代码不是针对单个文件,而是对多个文件夹进行打包加密。

加密方法仅仅是多个文件打包。

 

-----------------------------------------------------------------------------------

我是可爱的分割线

-----------------------------------------------------------------------------------

 

用到的知识点:

1、读写文件

2、对文件夹、文件的操作,获取所有的文件

 

-----------------------------------------------------------------------------------

我是可爱的分割线

-----------------------------------------------------------------------------------

下面是主要的代码:

复制内容到剪贴板
  1. using System;    
  2. using System.Collections.Generic;    
  3. using System.Linq;    
  4. using System.Text;    
  5. using System.Threading.Tasks;    
  6.     
  7.     
  8. namespace MyPackRes    
  9. {    
  10.     class Helper    
  11.     {    
  12.         public static void Log(string str)    
  13.         {    
  14.             Console.Write(str+"\n\n");    
  15.         }    
  16.     
  17.         public static void Pause()    
  18.         {    
  19.             Console.Write("Press any key to continue . . . ");    
  20.             Console.ReadKey(true);    
  21.         }    
  22.     }    
  23. }    
复制内容到剪贴板
  1. using System;    
  2. using System.Collections.Generic;    
  3. using System.Linq;    
  4. using System.Text;    
  5. using System.Threading.Tasks;    
  6. using System.IO;    
  7. using System.Diagnostics;    
  8.     
  9. namespace MyPackRes    
  10. {    
  11.     class Program    
  12.     {    
  13.         private static int m_id=0;    
  14.         private static int m_totalSize = 0;    
  15.     
  16. //         private static List<int> m_idList = new List<int>();    
  17. //         private static List<int> m_startPosList = new List<int>();    
  18. //         private static List<int> m_sizeList = new List<int>();    
  19. //         private static List<string> m_pathList = new List<string>();    
  20.     
  21.         private static Dictionary<int,OneFileInfor> m_allFileInfoDic = new Dictionary<int,OneFileInfor>();    
  22.     
  23.         private static string m_currentDir = "";    
  24.     
  25.         static void Main(string[] args)    
  26.         {    
  27.             m_currentDir = Environment.CurrentDirectory;    
  28.     
  29.             Helper.Log("MyPackRes Start " + m_currentDir);    
  30.     
  31.             List<string> folderToPackList = new List<string>();    
  32.     
  33.             /**  读取配置文件  **/    
  34.             Helper.Log("需要打包的文件夹:");    
  35.             StreamReader streamReader = new StreamReader("MyPackRes.ini", Encoding.Default);    
  36.             string line;    
  37.             while ((line=streamReader.ReadLine())!=null)    
  38.             {    
  39.                 Helper.Log(line);    
  40.                 if (!folderToPackList.Contains(line))    
  41.                 {    
  42.                     folderToPackList.Add(line);    
  43.                 }    
  44.             }    
  45.             streamReader.Close();    
  46.     
  47.             /**  遍历打包文件夹 **/    
  48.             for (int index = 0; index < folderToPackList.Count;index++ )    
  49.             {    
  50.                 PackFolder(folderToPackList[index]);    
  51.             }    
  52.     
  53.             Helper.Log("打包完毕!");    
  54.             Helper.Pause();    
  55.         }    
  56.     
  57.         /** 遍历文件夹获取所有文件信息 **/    
  58.         private static void TraverseFolder(string foldername)    
  59.         {    
  60.             Helper.Log("遍历文件夹 " + foldername);    
  61.     
  62.             /** 读取文件夹下面所有文件的信息 **/    
  63.             DirectoryInfo dirInfo = new DirectoryInfo(foldername);    
  64.     
  65.             foreach (FileInfo fileinfo in dirInfo.GetFiles("*.*",SearchOption.AllDirectories))    
  66.             {    
  67.                 string filename = (fileinfo.FullName.Replace(m_currentDir+"\\","")).Replace("\\","/");   
  68.                 int filesize = (int)fileinfo.Length;   
  69.    
  70.                 Helper.Log(m_id + " : " + filename + " 文件大小: " + filesize);   
  71.    
  72.                 OneFileInfor info = new OneFileInfor();   
  73.                 info.m_id = m_id;   
  74.                 info.m_Size = filesize;   
  75.                 info.m_Path = filename;   
  76.                    
  77.                 /**  读取这个文件  **/   
  78.                 FileStream fileStreamRead = new FileStream(fileinfo.FullName, FileMode.Open, FileAccess.Read);   
  79.                 if (fileStreamRead == null)   
  80.                 {   
  81.                     Helper.Log("读取文件失败 : "+fileinfo.FullName);   
  82.                     Helper.Pause();   
  83.                     return;   
  84.                 }   
  85.                 else   
  86.                 {   
  87.                     byte[] filedata = new byte[filesize];   
  88.                     fileStreamRead.Read(filedata, 0, filesize);   
  89.                     info.m_data = filedata;   
  90.                 }   
  91.                 fileStreamRead.Close();   
  92.    
  93.    
  94.                 m_allFileInfoDic.Add(m_id,info);   
  95.    
  96.                 m_id++;   
  97.                 m_totalSize += filesize;   
  98.             }   
  99.         }   
  100.    
  101.    
  102.         /**  打包一个文件夹  **/   
  103.         private static void PackFolder(string foldername)   
  104.         {   
  105.             TraverseFolder(foldername);   
  106.    
  107.             Helper.Log("文件数量 : " + m_id);   
  108.             Helper.Log("文件总大小 : " + m_totalSize);   
  109.    
  110.             /**  更新文件在UPK中的起始点  **/   
  111.             int firstfilestartpos = 4 + (4 + 4 + 4 + 256) * m_allFileInfoDic.Count;   
  112.             int startpos = 0;   
  113.             for (int index = 0; index < m_allFileInfoDic.Count; index++)   
  114.             {   
  115.                 if (index == 0)   
  116.                 {   
  117.                     startpos = firstfilestartpos;   
  118.                 }   
  119.                 else   
  120.                 {   
  121.                     startpos = m_allFileInfoDic[index - 1].m_StartPos + m_allFileInfoDic[index - 1].m_Size;//上一个文件的开始+文件大小;   
  122.                 }   
  123.    
  124.                 m_allFileInfoDic[index].m_StartPos = startpos;   
  125.             }   
  126.    
  127.             /**  写文件  **/   
  128.             FileStream fileStream = new FileStream(foldername + ".UPK", FileMode.Create);   
  129.    
  130.             /**  文件总数量  **/   
  131.             byte[] totaliddata=System.BitConverter.GetBytes(m_id);   
  132.             fileStream.Write(totaliddata, 0, totaliddata.Length);   
  133.    
  134.             for (int index = 0; index < m_allFileInfoDic.Count;index++ )   
  135.             {   
  136.                 /** 写入ID **/   
  137.                 byte[] iddata = System.BitConverter.GetBytes(m_allFileInfoDic[index].m_id);   
  138.                 fileStream.Write(iddata, 0, iddata.Length);   
  139.    
  140.                 /**  写入StartPos  **/   
  141.                 byte[] startposdata = System.BitConverter.GetBytes(m_allFileInfoDic[index].m_StartPos);   
  142.                 fileStream.Write(startposdata, 0, startposdata.Length);   
  143.    
  144.                 /**  写入size  **/   
  145.                 byte[] sizedata = System.BitConverter.GetBytes(m_allFileInfoDic[index].m_Size);   
  146.                 fileStream.Write(sizedata, 0, sizedata.Length);   
  147.    
  148.                 /**  写入path  **/   
  149.                 byte[] pathdata = new byte[256];   
  150.                 byte[] mypathdata = new UTF8Encoding().GetBytes(m_allFileInfoDic[index].m_Path);   
  151.    
  152.                 for (int i = 0; i < mypathdata.Length; i++)   
  153.                 {   
  154.                     pathdata[i] = mypathdata[i];   
  155.                 }   
  156.                 pathdata[mypathdata.Length] = 0;   
  157.    
  158.                 fileStream.Write(pathdata, 0, pathdata.Length);                   
  159.             }   
  160.    
  161.             /**  写入文件数据  **/   
  162.             for (int index = 0; index < m_allFileInfoDic.Count; index++)   
  163.             {   
  164.                 fileStream.Write(m_allFileInfoDic[index].m_data, 0, m_allFileInfoDic[index].m_Size);   
  165.             }   
  166.    
  167.             fileStream.Flush();   
  168.             fileStream.Close();   
  169.    
  170.    
  171.             /** 重置数据 **/   
  172.             m_id = 0;   
  173.             m_totalSize = 0;   
  174.             m_allFileInfoDic.Clear();   
  175.    
  176.         }   
  177.     }   
  178.    
  179.    
  180.     public class OneFileInfor   
  181.     {   
  182.         public int m_id=0;   
  183.         public int m_StartPos=0;   
  184.         public int m_Size=0;   
  185.         public string m_Path="";    
  186.         public byte[] m_data = null;    
  187.     };    
  188. }    

 

-----------------------------------------------------------------------------------

我是可爱的分割线

-----------------------------------------------------------------------------------

代码浅显易懂 ( # ▽ # )

 

首先新建一个配置文件

MyPackRes.ini

 

里面添加需要打包的文件夹 每行一个:

添加需要打包的文件夹.png

看看我们运行结果。

首先看看我准备的图。从碧之轨迹中TP抽取的哦。

碧之轨迹.png

打包结束后,会生成UPK文件。

生成UPK文件.png

 

UPK,这个后缀是虚幻引擎的默认资源文件格式哦。

 

最后附上工程:http://download.csdn.net/detail/cp790621656/8393457 

感谢 _Captain 支持 磐实编程网 原文地址:
blog.csdn.net/huutu/article/details/43088413

文章信息

发布时间:2016-07-17

作者:_Captain

发布者:aquwcw

浏览次数: