• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆 - 97, 文章 - 22, 評論 - 81, 引用 - 0
            數(shù)據(jù)加載中……

            Pygame游戲開發(fā) 之五

            Pygame游戲開發(fā)之五

            小試牛刀

            大部分游戲都會對圖像文件進(jìn)行加密,這樣你就很難看到它的圖片信息,游戲就更加添加了神秘感。有加密自然有解密,所謂山外青山樓外樓,再高的加密手段都可以被破解,加密只是提高技術(shù)門檻,讓一部分人看不到你的圖片資源。

            在進(jìn)行加密之前,讓我們首先把文件的結(jié)構(gòu)組織一下,用文件夾來管理各類文件。

            root/

                   dat/

                          Animation/

                          Background/

                          Control/

                          Monster/

                          Player/

                   img/

                          Animation/

                          Background/

                          Control/

                          Monster/

                          Player/

                   snd/

                   src/

                          Tools/

            其中root表示游戲的根目錄,imgdat分別表示加密前和加密后的圖片文件的目錄,其下有相同的目錄結(jié)構(gòu),snd用于存放聲音文件,src存放的是后綴是.py.pyc等的python源文件。并且我們將加密的程序放在Tools目錄下。

                   首先我們要大致了解加密的過程,所謂加密就是先將數(shù)據(jù)以二進(jìn)制的形式從文件中讀進(jìn)來,然后采用適當(dāng)?shù)募用芩惴▽?shù)據(jù)變成另外一種形式的數(shù)據(jù),再存到文件中,這樣原本的文件格式就被當(dāng)前數(shù)據(jù)替換掉了。這里我們是對img中所有的后綴為png的文件加密,然后存到dat文件中,因為要對大批量文件進(jìn)行處理,最好的方法是采用批處理。

                   我們在Tools文件夾下建立一個Process.bat的批處理文件,并且對其進(jìn)行編輯,寫下以下命令:

            1     cd ../../img/

            2     dir /s /b *.png > ../src/Tools/FileName.txt

            3     cd ..

            4     xcopy /s /t img dat

            5     cd src/Tools/

            6     encode.exe FileName.txt img dat

            命令cd后跟一個目錄表示改變當(dāng)前目錄,如果跟的是“..”則表示跳到當(dāng)前目錄的父目錄下,例如第1句表示從Tools/目錄連跳兩層到root下并且進(jìn)入img目錄中,然后我們利用第2條命令將所有需要加密的文件的文件名輸出到Tools目錄下的FileName.txt文件中。

            dir *.png > file 表示將當(dāng)前文件下所有后綴為png的文件的文件信息輸出到file文件中。但是它包含文件信息不止文件名,所以可以采用/b開關(guān),表示采用空格式(Blank,沒有標(biāo)題信息或摘要),并且要求當(dāng)前目錄以及子目錄的png文件都要輸出,只要添加/s開關(guān)即可。

            然后我們回到root文件夾下,將img下的子文件夾全部復(fù)制到dat文件夾下,但是不復(fù)制文件,可以采用xcopy命令來實現(xiàn)。

            最后調(diào)用encode.exeFileName.txt文件中列出的文件加密后輸出到dat文件夾下。encode.exe是我自己寫的一個加密的小程序,這里為了方便我用C語言來實現(xiàn)。

                   代碼如下:

            #include <string>

            #include 
            <vector>

            using namespace std;

             

            #define key 367

            FILE 
            *fpSourceFile;

            FILE 
            *fpReadFile, *fpWriteFile;

            char szReadFileName[ MAX_PATH ];

            vector 
            <char> vec;

             

            string Replace(string Src, string from, string to) {

                   
            string Tmp;

                   
            string::size_type nCount = Src.find(from);

                   
            if(nCount != string::npos) {

                          Tmp 
            = Src.substr(0, nCount);

                          Tmp 
            = Tmp + to + "\\" + Src.substr(nCount + from.size() + 1);

                          nCount 
            = Tmp.find(".");

                          
            if(nCount != string::npos)

                                 Tmp 
            = Tmp.substr(0, nCount+1);

                          
            return Tmp + "zty";

                   }


                   
            return "";

            }


             

            int main(int argc, char* argv[]) {

                   
            int i;

                   
            if(argc == 4{

                          fpSourceFile 
            = fopen(argv[1], "rt");

                          
            while(fgets(szReadFileName, MAX_PATH, fpSourceFile)) {

                                 szReadFileName[ strlen(szReadFileName) 
            - 1 ] = '\0';

                                 fpReadFile 
            = fopen(szReadFileName, "rb");

                                 
            if(fpReadFile) {

                                        fseek(fpReadFile, 
            0, SEEK_END);

                                        
            long nFileSize = ftell(fpReadFile);

                                        fseek(fpReadFile, 
            0, SEEK_SET);

                                        vec.resize(nFileSize);

                                        fread((
            void *)&vec[0], nFileSize, 1, fpReadFile);

                                        
            for(i = 0; i < vec.size(); i++{

                                               vec[i] 
            = (vec[i] ^ key);

                                        }


                                        fclose(fpReadFile);

                                        
            string outFile = Replace(string(szReadFileName), string(argv[2]), string(argv[3]));

                                        fpWriteFile 
            = fopen(outFile.c_str(), "wb");

                                        fwrite((
            void *)&vec[0], nFileSize, 1, fpWriteFile);

                                        fclose(fpWriteFile);

                                 }


                          }


                          fclose(fpSourceFile);

                   }
            else {

                          printf(
            "請運(yùn)行Process.bat文件\n");

                   }


                   
            return 0;
            }


                   起初,讀入的數(shù)據(jù)是存到vec這個向量中的,然后我們通過遍歷vec的每一個字節(jié)對數(shù)據(jù)進(jìn)行加密,加密的方法很多,這里采用最簡單的異或(二進(jìn)制位相同為0,不同為1)方式,這樣解密也比較簡單。來看一個例子:

                   對于102(二進(jìn)制表示為1100110),我們將它和給定的key(十進(jìn)制367、二進(jìn)制表示為101101111)值進(jìn)行異或,如下:

                   001100110 102

            101101111 367

            —————

                   100001001 265

            原本的數(shù)據(jù)102就轉(zhuǎn)化成了和原先看似無關(guān)的數(shù)據(jù)265,如此一來,將所有的數(shù)據(jù)加密完畢后,原本的圖像文件的文件頭信息也被毀了,根本無法用常用的圖像工具打開。加密的目的就達(dá)到了。當(dāng)然如果加密完后連你自己也不知道怎么解密,那么這件事情就沒意義了…-_-|||,所以我們還要對加密好數(shù)據(jù)進(jìn)行解密,當(dāng)然這要在程序中控制。

                   這個只需將原先的load_image函數(shù)進(jìn)行一個修改即可。

            def load_image(file) :

                   do_load()

                   return Surface

             

                   do_load()函數(shù)首先要用二進(jìn)制方式讀取file文件,并且通過read()接口得到文件中所有的二進(jìn)制數(shù)據(jù),通過tell()接口得到文件的大小。

                   然后利用以下的循環(huán)就可以將數(shù)據(jù)進(jìn)行解密了。

                i = 0

                data = []

                while i < filesize :

                    data.append( chr( (ord(filedata[i]) ^ key) % 256 ) )

                    i += 1

            data = ''.join(data)

            在這里因為用的是異或操作,所以解密和加密的過程是一樣的,因為異或滿足結(jié)合律,一個數(shù)異或上它本身等于0,任何數(shù)異或0等于它本身。于是可以這樣想,某個數(shù)據(jù)異或了key(加密的過程),再異或一次key(解密的過程),就好比:Num^key^key = Num^(key^key) = Num^0=Num這樣原先的數(shù)據(jù)就恢復(fù)了。

            因為python中沒有字符的概念,我們可以通過ord(‘x’) 得到’x’ASCII碼,進(jìn)行解密操作后,再用chr(num)得到num的字符形式,最后將所有的字符數(shù)據(jù)通過join接口連接到一起變成數(shù)據(jù)流,然后通過write接口將它暫存到buf.png文件中,再調(diào)用pygame.image.load('buf.png')將它讀入,就得到了file對應(yīng)的Surface。(未完待續(xù))

            posted on 2011-05-01 16:40 英雄哪里出來 閱讀(3950) 評論(0)  編輯 收藏 引用 所屬分類: Pygame

            久久93精品国产91久久综合| 久久av高潮av无码av喷吹| 国产成人综合久久久久久| 99久久婷婷国产综合精品草原| 精品综合久久久久久97| 欧美亚洲国产精品久久高清| 成人综合伊人五月婷久久| 国产69精品久久久久99尤物| 97久久精品无码一区二区天美| 99久久精品国产麻豆| 亚洲国产精品久久66| 九九精品99久久久香蕉| 成人久久精品一区二区三区| 人妻久久久一区二区三区| 99蜜桃臀久久久欧美精品网站| 国产精品99久久久精品无码| 日产精品久久久一区二区| 97久久超碰国产精品2021| 韩国无遮挡三级久久| 99久久夜色精品国产网站| 久久精品一区二区影院 | 欧美激情精品久久久久久| 国产亚洲色婷婷久久99精品91| 一本一道久久精品综合| 久久99精品国产| 一极黄色视频久久网站| 久久国产精品一区| 9999国产精品欧美久久久久久| 久久99久国产麻精品66| 思思久久99热只有频精品66| 久久99精品久久久久久野外| 狠狠色丁香久久婷婷综合蜜芽五月 | 久久久久99精品成人片三人毛片| 久久国产视频网| 99久久国产精品免费一区二区| 久久综合香蕉国产蜜臀AV| 久久夜色tv网站| 麻豆一区二区99久久久久| 久久国产一片免费观看| 久久午夜无码鲁丝片| 人妻无码精品久久亚瑟影视|