那些事情是用Unity開發(fā)項(xiàng)目應(yīng)該一開始規(guī)劃好的?如何避免后期釀成巨坑橄杨?

Unity的游戲很容易被人反編譯出來(lái)七芭,然后再重新打包發(fā)布,把自己辛辛苦苦開發(fā)的游戲蔑赘,抄寫的一絲不掛狸驳。很多項(xiàng)目要求要做好資源加密,Unity中如何做好資源加密呢缩赛?本文給大家分享加密算法+資源打包整合思路:

(1) 游戲資源加密如何選擇加密算法;

(2) Assetsbundle資源包的加密與解密;

游戲資源包如何選擇加密算法

游戲資源包加密的第一件事情就是選一個(gè)什么樣的加密/解密算法,比較不容易被人破解耙箍。我們?nèi)绾蝸?lái)選擇呢?很遺憾的告訴大家酥馍,沒有任何一個(gè)保險(xiǎn)的加密解密算法是安全的辩昆。杠精第一時(shí)間就會(huì)來(lái)反駁,這怎么可能旨袒,我加密了他怎么破解汁针?游戲資源加密注定了加密算法不能用太耗時(shí)的加密算法。接下來(lái)我們來(lái)看下不同加密算法是如何被破解的砚尽。

(1) 使用標(biāo)準(zhǔn)庫(kù)實(shí)現(xiàn)的加密解密算法,比如使用encrypt加密/解密算法施无。這里有個(gè)問題,我們會(huì)有一個(gè)密鑰用來(lái)解密必孤,密鑰一般游戲都寫死到代碼里猾骡。這種破解太簡(jiǎn)單了,密鑰寫死在代碼里敷搪,基本都是字符串等,靜態(tài)分析代碼找到密鑰對(duì)應(yīng)的字符串兴想,有了密鑰,你用的是標(biāo)準(zhǔn)庫(kù),一下加密資源就破解了赡勘,分分鐘你的資源就被破解了嫂便。

(2) 使用自己實(shí)現(xiàn)的加密解密算法,比如闸与,采用二進(jìn)制亦或來(lái)做加密解密顽悼,比如,加密定一個(gè)二進(jìn)制掩碼mask, 讓每個(gè)字節(jié)都異或這個(gè)mask,得到一個(gè)新的數(shù)據(jù)几迄,這樣資源就不能被直接識(shí)別出來(lái),使用資源得時(shí)候蔚龙,再把加密數(shù)據(jù)異或一次mask在解密回來(lái)到項(xiàng)目中使用。這種破解稍微蠻煩寫映胁,需要自己反編譯你的解密代碼木羹,同時(shí)還要找到你的解密密鑰key。但是本質(zhì)也比較容易破解。

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

源數(shù)據(jù)1110 0001, 密鑰為 00101000;

加密數(shù)據(jù): 1110 0001 ^ 00101000 = 1100 1001

解密數(shù)據(jù): 1100 1001 ^ 00101000 = 1110 0001

所有從上面分析來(lái)看想要不被破解坑填,幾乎是很難抛人,就看破解的代價(jià)。你這個(gè)游戲是否值得脐瑰。一般我們的目標(biāo)就是不要讓人通過Unity反編譯工具就能直接讓我們的游戲直接反編譯出Unity項(xiàng)目工程妖枚,然后重新編譯打包發(fā)布就可以了。解密算法要快苍在,注定他不會(huì)太復(fù)雜绝页,密鑰單一的放客戶端或是網(wǎng)絡(luò),注定能獲取到寂恬。

Assetsbundle資源包的加密與解密

分析完加密解密算法以后续誉,接下來(lái)我們就來(lái)看下如何加密我們的資源,先來(lái)介紹第一種方案初肉,打資源包的時(shí)候酷鸦,加密單個(gè)的資源, 把加密后的數(shù)據(jù)打入到資源包。解密的時(shí)候,從ab包中讀取資源牙咏,然后再把資源包里的內(nèi)容解密開來(lái)臼隔。具體做法如下:

(1) 新建一個(gè)類,繼承自FileStream, 重寫Read/Write函數(shù)妄壶。代碼如下:

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包打包工具腳本,再對(duì)生成的ab包資源加密一次,打包加密腳本如下:

[MenuItem("Tools/BuildAB")]

static void BuildAB()

{

? ? …

? ? // for循環(huán)遍歷里面的打包后的每個(gè)資源Ab包盯拱,然后調(diào)用進(jìn)行加密盒发。

? ? 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); // 觸發(fā)MyStream中我們重寫的write函數(shù)的調(diào)用, 完成數(shù)據(jù)加密

? ? ? ? }

? ? }

? ? AssetDatabase.Refresh();

}

(3) 解密的時(shí)候,讀取ab包,使用函數(shù)AssetsBundle.LoadFromStream來(lái)加載狡逢,而這個(gè)會(huì)觸發(fā)Stream在Read讀數(shù)據(jù)接口調(diào)用宁舰,就可以進(jìn)入我們重載的Read接口,來(lái)做解密。代碼如下:

var fileStream = new MyStream(Application.streamingAssetsPath + "/encypt_myab.unity3d", FileMode.Open, FileAccess.Read, FileShare.None, 1024 * 4, false))

{

? ? var myLoadedAssetBundle = AssetBundle.LoadFromStream(fileStream); // 觸發(fā)MyStream中的Read調(diào)用奢浑,來(lái)解密數(shù)據(jù)蛮艰。

}

今天的分享就到這里了,可以進(jìn)入學(xué)習(xí)小組一起交流游戲開發(fā)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末雀彼,一起剝皮案震驚了整個(gè)濱河市壤蚜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌徊哑,老刑警劉巖袜刷,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異莺丑,居然都是意外死亡著蟹,警方通過查閱死者的電腦和手機(jī)墩蔓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)萧豆,“玉大人奸披,你說我怎么就攤上這事′汤祝” “怎么了阵面?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)洪鸭。 經(jīng)常有香客問我样刷,道長(zhǎng),這世上最難降的妖魔是什么卿嘲? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任颂斜,我火速辦了婚禮夫壁,結(jié)果婚禮上拾枣,老公的妹妹穿的比我還像新娘。我一直安慰自己盒让,他們只是感情好梅肤,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著邑茄,像睡著了一般姨蝴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上肺缕,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天左医,我揣著相機(jī)與錄音,去河邊找鬼同木。 笑死浮梢,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的彤路。 我是一名探鬼主播秕硝,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼洲尊!你這毒婦竟也來(lái)了远豺?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤坞嘀,失蹤者是張志新(化名)和其女友劉穎躯护,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體丽涩,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡榛做,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片检眯。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡厘擂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出锰瘸,到底是詐尸還是另有隱情刽严,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布避凝,位于F島的核電站舞萄,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏管削。R本人自食惡果不足惜倒脓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望含思。 院中可真熱鬧崎弃,春花似錦、人聲如沸含潘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)遏弱。三九已至盆均,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間漱逸,已是汗流浹背泪姨。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留饰抒,地道東北人肮砾。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像循集,于是被迫代替她去往敵國(guó)和親唇敞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 用兩張圖告訴你咒彤,為什么你的 App 會(huì)卡頓? - Android - 掘金 Cover 有什么料疆柔? 從這篇文章中你...
    hw1212閱讀 12,712評(píng)論 2 59
  • 參考鏈接:https://www.52pojie.cn/thread-742703-1-1.html[https:...
    454e298e2b40閱讀 1,815評(píng)論 0 0
  • 記錄一下個(gè)人對(duì)于公眾號(hào)算法愛好者和程序員小灰的閱讀摘要,目錄如下镶柱, B-樹(B-tree) B-樹就是B樹旷档,中間的...
    chenfh5閱讀 2,016評(píng)論 0 4
  • 1.一個(gè)NSObject對(duì)象占用多少內(nèi)存? 64bit: sizeof 也是以8字節(jié)對(duì)齊,是個(gè)運(yùn)算符直接傳類型計(jì)算...
    流星閣閱讀 1,789評(píng)論 0 10
  • 1.早期的計(jì)算 1).本系列會(huì)了解到位(bit)歇拆、字節(jié)(byte)范咨、晶體管(transistors)與邏輯門(lo...
    曉先生ol閱讀 828評(píng)論 0 0