1. 程式人生 > >圖片資源加密,Lua檔案加密

圖片資源加密,Lua檔案加密

轉自:http://www.cnblogs.com/zisou/p/cocos2dxJQ-67.html

遊戲開發中常遇到資源保護的問題。

目前遊戲開發中常加密的檔案型別有:圖片,Lua檔案,音訊等檔案,而其實加密也是一把雙刃劍。

需要安全那就得耗費一定的資源去實現它。目前網上也有用TexturePacker工具來加密的,不過針對性還是不夠強。

分析一下原理為:

1,轉格式:將需要加密的檔案轉為流的方式;

2,加密:根據自己需要使用加密手段,MD5,AES,甚至可以直接改變位移,加一些自己的特殊字元也可以使檔案簡單加密,加密完後基本保證

圖片型別基本用特殊軟體預覽不了也打不開,Lua檔案加密後一片亂碼····;

3,儲存自定義格式檔案:另存為自己特殊型別的檔名如"xx.d" "xx.xyz"等。

4,圖片解密:修改cocos2dx底層庫的獲取路徑處,和載入CCImage紋理處理時的原始碼修改;

5,特殊Lua檔案介面:修改對應Lua載入方法;

基本原理清楚了後我貼幾段我自己專案中常用的加密方式:

首先是轉格式並且加密的方式

複製程式碼
bool PublicCommen::recode_getFileByName(string pFileName){
    
    unsigned long nSize = 0;
    unsigned char* pBuffer = CCFileUtils::sharedFileUtils()->getFileData(
                                                                         pFileName.c_str(),
                                                                         
"rb",&nSize); unsigned char* newBuf = new unsigned char[nSize]; int newblen = nSize; if(pBuffer!=NULL&&nSize>0) { for (int i = 0; i<nSize; i++) { newBuf[i]=pBuffer[i]+MD5; } string savepath = pFileName; savepath = savepath.substr(0
,savepath.length()-4); savepath = savepath + "xx.X"; FILE *fp = fopen(savepath.c_str(), "wb+"); fwrite(newBuf, 1, newblen, fp); fclose(fp); CCLOG("save file ok. path = %s" ,savepath.c_str()); return true; } return false; }
複製程式碼

通常可以自己寫一個應用程式遍歷一下自定義目錄下,需要轉的資原始檔,對應的把所有資源轉換並加密;

裡面newBuf[i]=pBuffer[i]+MD5;這段可以自由發揮!解密的時候需要對應!

當然你也可以取巧的放進你的遊戲中修改cocos2dx底層的CCFileUtils::fullPathForFilename獲取全路徑的方法中;

下面說一下解密:

圖片的解密需要修改cocos2dx CCTexture2D 的CCTextureCache::addImage類裡面修改

複製程式碼
CCTexture2D * CCTextureCache::addImage(const char * path)
{
    CCAssert(path != NULL, "TextureCache: fileimage MUST not be NULL");

    CCTexture2D * texture = NULL;
    CCImage* pImage = NULL;
    // Split up directory and filename
    // MUTEX:
    // Needed since addImageAsync calls this method from a different thread
    
    //pthread_mutex_lock(m_pDictLock);

    std::string pathKey = path;

    pathKey = CCFileUtils::sharedFileUtils()->fullPathForFilename(pathKey.c_str());
    if (pathKey.size() == 0)
    {
        return NULL;
    }
    texture = (CCTexture2D*)m_pTextures->objectForKey(pathKey.c_str());

    std::string fullpath = pathKey; // (CCFileUtils::sharedFileUtils()->fullPathFromRelativePath(path));
    if (! texture) 
    {
        std::string lowerCase(pathKey);
        for (unsigned int i = 0; i < lowerCase.length(); ++i)
        {
            lowerCase[i] = tolower(lowerCase[i]);
        }
        // all images are handled by UIImage except PVR extension that is handled by our own handler
        do 
        {
            if (std::string::npos != lowerCase.find(".pvr"))
            {
                texture = this->addPVRImage(fullpath.c_str());
            }
            else if (std::string::npos != lowerCase.find(".pkm"))
            {
                // ETC1 file format, only supportted on Android
                texture = this->addETCImage(fullpath.c_str());
            }
            else
            {
                CCImage::EImageFormat eImageFormat = CCImage::kFmtUnKnown;
                if (std::string::npos != lowerCase.find(".png"))
                {
                    eImageFormat = CCImage::kFmtPng;
                }
                else if (std::string::npos != lowerCase.find(".jpg") || std::string::npos != lowerCase.find(".jpeg"))
                {
                    eImageFormat = CCImage::kFmtJpg;
                }
                else if (std::string::npos != lowerCase.find(".tif") || std::string::npos != lowerCase.find(".tiff"))
                {
                    eImageFormat = CCImage::kFmtTiff;
                }
                else if (std::string::npos != lowerCase.find(".webp"))
                {
                    eImageFormat = CCImage::kFmtWebp;
                }
                else if (std::string::npos != lowerCase.find("XX.X"))
                {
                    eImageFormat = CCImage::xxxxx;
                }
                
                pImage = new CCImage();
                CC_BREAK_IF(NULL == pImage);

                bool bRet = pImage->initWithImageFile(fullpath.c_str(), eImageFormat);
                CC_BREAK_IF(!bRet);

                texture = new CCTexture2D();
                
                if( texture &&
                    texture->initWithImage(pImage) )
                {
#if CC_ENABLE_CACHE_TEXTURE_DATA
                    // cache the texture file name
                    VolatileTexture::addImageTexture(texture, fullpath.c_str(), eImageFormat);
#endif
                    m_pTextures->setObject(texture, pathKey.c_str());
                    texture->release();
                }
                else
                {
                    CCLOG("cocos2d: Couldn't create texture for file:%s in CCTextureCache", path);
                }
            }
        } while (0);
    }

    CC_SAFE_RELEASE(pImage);

    //pthread_mutex_unlock(m_pDictLock);
    return texture;
}
複製程式碼

並且在CCImage的圖片型別中新增你加密後的圖片型別如:CCImage::xxxxx

然後跟到 bool bRet = pImage->initWithImageFile(fullpath.c_str(), eImageFormat);

CCImage.mm中的CCImage::initWithImageFile方法;

複製程式碼
bool CCImage::initWithImageFile(const char * strPath, EImageFormat eImgFmt/* = eFmtPng*/)
{
    bool bRet = false;
    unsigned long nSize = 0;
    unsigned char* pBuffer = CCFileUtils::sharedFileUtils()->getFileData(
                CCFileUtils::sharedFileUtils()->fullPathForFilename(strPath).c_str(),
                "rb",
                &nSize);
    if(eImgFmt==xxxxxx)
    {
        for (int i= 0; i < nSize; i++) {
            pBuffer[i] = pBuffer[i]-MD5;
        }
        pBuffer[nSize] = pBuffer[nSize]-1;
        eImgFmt = kFmtPng;
    }
    
    if (pBuffer != NULL && nSize > 0)
    {
        bRet = initWithImageData(pBuffer, nSize, eImgFmt);
    }
    CC_SAFE_DELETE_ARRAY(pBuffer);
    return bRet;
}
複製程式碼

其中 pBuffer[i] = pBuffer[i]-MD5;需要和之前加密的時候對應·····自己發揮!

Ok,只要是圖片,並且是屬於你自定義型別的圖片都會得到解密的真實texture

Lua的解密也是基本一樣的思路,不過解密需要單獨在需要載入Lua的方法前先解密,要考慮跨平臺性


相關推薦

圖片資源加密Lua檔案加密

轉自:http://www.cnblogs.com/zisou/p/cocos2dxJQ-67.html 遊戲開發中常遇到資源保護的問題。 目前遊戲開發中常加密的檔案型別有:圖片,Lua檔案,音訊等檔案,而其實加密也是一把雙刃劍。 需要安全那就得耗費一定的資源去實

JNDI配置資料來源dbcp方式配置檔案加密

1.使用jd-gui對tomcat-dbcp.jar反編譯 反編譯後的程式碼按照專案目錄匯入myeclipse中進行編輯,匯入的程式碼中包含很多錯誤,這是由於反編譯的並不完全正確的原因,需要自己調整錯誤。 2.找到BasicDataSourceFac

關於cocos2dx手遊lua檔案加密的解決方案

      很多使用cocos2dx+lua做遊戲的同學,都會想到一個問題,我的遊戲一旦釋出,怎樣才能保證的我指令碼程式碼不被破解,不洩露程式碼。雖然這和開源、共享的原則不合,但是程式碼也是coder的勞動成果,理應得到保護。特別是商業遊戲更是如此,不希望被別人破解掉原始碼

對稱加密非對稱加密詳解

在使用一些軟體或者是系統的時候,我們常常聽到或者看到“公鑰”,“私鑰”這兩個詞,比如,我們在使用git的時候,常常要去先使用git生成自己的公鑰和私鑰,然後將公鑰提交到搭建了git的雲程式碼管理網站上去進行協作開發,那麼這個公鑰私鑰究竟是個什麼鬼? 一、對稱加密解密方式 我們的資料傳

辦公文件加密企業文件加密強制性透明加密技術fasoft

隨著企事業單位的快速發展,文件以電子文件方式為企事業單位承載著越來越多重要的資訊。而由於電子文件的容易散播性,導致企事業單位在外發給客戶或合作伙伴的重要資料,都可能會在這互動的過程中被篡改、無序傳播等,這使得企事業單位所做的努力都付之東流,嚴重危害了自身的利益。那麼,網際網路時代的資料資訊保安應該如何維護?

辦公文檔加密企業文檔加密強制性透明加密技術fasoft

計劃 產品 安全事件 選擇 進入 防護 個人信息 nod 數據安全 隨著企事業單位的快速發展,文檔以電子文檔方式為企事業單位承載著越來越多重要的信息。而由於電子文檔的容易散播性,導致企事業單位在外發給客戶或合作夥伴的重要資料,都可能會在這交互的過程中被篡改、無序傳播等,這使

windows中使用Python進行AES加密解密-文字檔案加密工具

之前的文章http://blog.csdn.net/u013578500/article/details/77905924 簡單介紹了一下使用PyCrypto模組實現對字串的加密解密,裡面有提到我利用這個模組寫了一個對文字檔案進行加密解密的小指令碼,這裡和大家分享一下。 1

【上】安全HTTPS-全面詳解對稱加密非對稱加密數字簽名數字證書和HTTPS

此文章轉載來源於http://blog.csdn.net/tenfyguo/article/details/40922813點選開啟連結 一,對稱加密 所謂對稱加密,就是它們在編碼時使用的金鑰e和解碼時一樣d(e=d),我們就將其統稱為金鑰k。 對稱加解密的過

JS 不可逆加密高階 JavaScript 加密

(function(w, d) { w.info = "這是一個高階加密的方式,加密後不能恢復,請儲存好原始碼。"; d.adinfo = "站長接手動加密,保衛你的 js。"; })(window, document); 加密後內容是: var _0x9272=["\x

【下】安全HTTPS-全面詳解對稱加密非對稱加密數字簽名數字證書和HTTPS

此文章轉載來源於http://blog.csdn.net/tenfyguo/article/details/40958727點選開啟連結 1.  HTTPS 1.1. 什麼是HTTPS HTTPS(HypertextTransfer Protocol Secur

安卓中的對稱加密非對稱加密MD5加密的演算法

轉自:http://blog.csdn.net/fengkaungdewoniu/article/details/52846025 安卓中使用的加密演算法可以說有三種:對稱加密、非對稱加密,及MD5加密。 對稱加密: 對稱加密又稱作私鑰加密。(舉例:家裡大門開門

圖片上傳檔案上傳。外掛diyUpload.js

//        上傳圖片       $('#test').diyUpload({             url:'server/fileupload.php',             success:function( data ) {                 console.info( d

在Javascript 中的Base64加密支援中文加密及emoji表情的unicode編碼的base64加密

轉載高人分享的Base64加密。 解決了樓主在使用webscoket做web了聊天介面時出現的emoji表情的unicode編碼的base64加密錯誤問題。 (function(global) {     'use strict';     // existing vers

Cocos2d-lua 3.10 圖片資源加密

在遊戲釋出之前,最好將圖片加密,為apk/ipa加一層保護(雖然可能沒用),涉及兩個問題: 1. 如何對圖片加密 2. 如何讀取加密後的圖片 下面詳細說明。 對圖片加密 Quick-3.3提供了pack_files.sh可以實現對圖片加密,基本原理

.NET實現一機一碼加密、把EXE變成圖片運行被破解自動銷毀隨時授權回收

一機一碼加密 net一機一碼 exe變成圖片運行 把軟件變成圖片後運行 提示:本套課程首發於51CTO學院,歡迎各位學員來51CTO查看視頻課程課程目標學會用一機一碼來加密自己的.NET程序,被破解後自動銷毀隨時授權回收升級,為了提高破解難度,還可以把exe變成圖片運行(圖片可以正常打開),課

(轉)quick-cocos2d-x圖片資源加密(續)

player AD sign 信息 text 語句 osc osi pan 摘要: 對在quick-cocos2d-x上實現的資源加密方法的補充 前篇: quick-cocos2d-x圖片資源加密 讓quick-cocos2d-x支持加密的plist文件 通過前篇的

(轉)quick-cocos2d-x圖片資源加密

做了 zip ali tran -o AD nor lena s2d 摘要: 在quick-cocos2d-x上實現的一種圖片資源加密的方法,現已經加入官方最新版本之中 ###quick-x已經支持用XXTEA加密方式對腳本文件進行加密。在此基礎上,自己做了一些工作,對

[Cocos2dx]cocos luacompile命令加密lua檔案

用法介紹 命令cocos luacompile --h檢視用法 usage: cocos luacompile [-h] [-v] [-s SRC_DIR_ARR] [-d DST_DIR] [-e] [-k ENCRYPTKEY] [-b

將資料庫查詢資料封裝到XML檔案進行格式化處理並進行加密操作和解密操作

1.pom檔案 <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.7&l

SSM框架下登入頁面圖片驗證碼密碼加密對比資料庫資料(二)

登入頁面的Controller的程式碼如下: 在這過程中,需要對填入資料進行判斷,是否為使用者名稱存在?是否密碼有誤?是否驗證碼有誤?如若都沒有錯誤則頁面跳轉至登入成功頁面。 @RequsetMapper("/login.do") public @Respons