青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 97, 文章 - 22, 評論 - 81, 引用 - 0
數據加載中……

Pygame游戲開發 之五

Pygame游戲開發之五

小試牛刀

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

在進行加密之前,讓我們首先把文件的結構組織一下,用文件夾來管理各類文件。

root/

       dat/

              Animation/

              Background/

              Control/

              Monster/

              Player/

       img/

              Animation/

              Background/

              Control/

              Monster/

              Player/

       snd/

       src/

              Tools/

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

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

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

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后跟一個目錄表示改變當前目錄,如果跟的是“..”則表示跳到當前目錄的父目錄下,例如第1句表示從Tools/目錄連跳兩層到root下并且進入img目錄中,然后我們利用第2條命令將所有需要加密的文件的文件名輸出到Tools目錄下的FileName.txt文件中。

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

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

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

       代碼如下:

#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(
"請運行Process.bat文件\n");

       }


       
return 0;
}


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

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

       001100110 102

101101111 367

—————

       100001001 265

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

       這個只需將原先的load_image函數進行一個修改即可。

def load_image(file) :

       do_load()

       return Surface

 

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

       然后利用以下的循環就可以將數據進行解密了。

    i = 0

    data = []

    while i < filesize :

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

        i += 1

data = ''.join(data)

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

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

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

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲欧美日韩国产中文| 欧美激情一区二区三区在线视频| 亚洲人成在线播放| 久久成人一区| 欧美在线3区| 国产精品久久九九| 亚洲人www| 亚洲国产精品福利| 久久激情综合网| 久久精品1区| 国产精品毛片a∨一区二区三区|国| 欧美激情按摩在线| 亚洲二区在线| 久久婷婷国产综合国色天香| 久久婷婷综合激情| 国产综合第一页| 久久国产精品72免费观看| 欧美一区二区三区啪啪| 国产裸体写真av一区二区| 9l国产精品久久久久麻豆| 在线中文字幕一区| 欧美日韩一区二区在线观看| 亚洲精品永久免费精品| 一本大道av伊人久久综合| 欧美精品久久久久久久免费观看| 最新亚洲一区| 中日韩美女免费视频网站在线观看| 欧美激情中文字幕一区二区 | 一本色道久久综合狠狠躁篇的优点| 免费观看日韩av| 欧美激情综合色| 99精品欧美一区二区三区| 欧美日韩蜜桃| 亚洲一区二区在线视频| 欧美一区亚洲二区| 激情久久中文字幕| 你懂的视频一区二区| 亚洲欧洲精品一区二区| 亚洲少妇自拍| 国产日本欧美一区二区三区在线 | 国产伦理一区| 欧美中文字幕在线播放| 欧美成人国产va精品日本一级| 最新国产成人在线观看| 欧美日韩精品欧美日韩精品一| 亚洲婷婷在线| 另类尿喷潮videofree| 亚洲巨乳在线| 国产精品欧美日韩久久| 久久久久久自在自线| 日韩亚洲精品电影| 久久精品最新地址| 亚洲乱码国产乱码精品精可以看 | 亚洲国产精品va在线看黑人动漫| 欧美激情综合在线| 亚洲欧美一级二级三级| 欧美激情亚洲| 性欧美1819sex性高清| 在线欧美福利| 国产精品美女久久久| 久久一本综合频道| 亚洲尤物在线视频观看| 欧美高清不卡| 欧美在线免费观看视频| 亚洲精品欧美一区二区三区| 国产欧美二区| 欧美区日韩区| 噜噜爱69成人精品| 亚洲女与黑人做爰| 亚洲精品在线视频| 免费试看一区| 久久国产欧美日韩精品| 中日韩美女免费视频网站在线观看| 国模套图日韩精品一区二区| 欧美日本一区| 欧美.www| 久久综合国产精品| 欧美一区二区日韩一区二区| 99这里只有精品| 亚洲国产高清在线| 久久婷婷影院| 久久国产精品久久久久久久久久| 99riav国产精品| 亚洲国产精品成人一区二区| 国产亚洲视频在线| 欧美视频日韩视频在线观看| 欧美福利电影在线观看| 久久久女女女女999久久| 亚洲欧美电影在线观看| 一区二区免费在线视频| 亚洲日本欧美在线| 亚洲大胆美女视频| 欧美成人69av| 久久精品一区二区三区不卡| 性色av一区二区怡红| 国产精品99久久久久久久久| 日韩视频国产视频| 亚洲日本成人| 亚洲精品国偷自产在线99热| 亚洲国产毛片完整版| 亚洲福利国产| 亚洲欧洲日韩在线| 亚洲区中文字幕| 久久久人人人| 在线视频日韩精品| 亚洲破处大片| 亚洲精品国久久99热| 亚洲国产婷婷综合在线精品| 亚洲国产精品成人综合| 亚洲国产小视频在线观看| 亚洲韩国日本中文字幕| 亚洲国产欧美一区| 亚洲精品美女久久7777777| 亚洲精品久久久蜜桃| 9国产精品视频| 亚洲视频免费观看| 亚洲欧美中文日韩在线| 久久国产精品久久久久久| 欧美中文字幕在线观看| 裸体一区二区| 亚洲国产精品www| 亚洲精品一区二区三区蜜桃久| 99在线热播精品免费| 亚洲在线视频观看| 久久国产加勒比精品无码| 麻豆成人综合网| 欧美日韩美女在线| 国产日韩一区二区三区| 亚洲第一二三四五区| 一区二区欧美日韩视频| 性伦欧美刺激片在线观看| 久久综合五月天婷婷伊人| 亚洲黄色成人久久久| 亚洲一区黄色| 久久久夜精品| 欧美日韩一区高清| 国产一二三精品| 日韩视频第一页| 欧美一区二区三区喷汁尤物| 欧美1区3d| 中文一区二区| 久久香蕉国产线看观看网| 欧美日韩国产区| 黑人巨大精品欧美一区二区| 9色精品在线| 久久久噜噜噜久噜久久| 亚洲精品影院在线观看| 久久av一区二区三区| 欧美日韩国产综合久久| 国产一区二区三区的电影| 日韩一级大片| 美女免费视频一区| 亚洲午夜免费福利视频| 欧美1区2区| 国产视频一区免费看| 国产精品99久久久久久白浆小说| 久久一区国产| 亚洲主播在线| 欧美日韩一区二区三区在线视频| 国内精品福利| 亚洲欧美伊人| 亚洲毛片播放| 你懂的视频一区二区| 国产一区二区无遮挡| 亚洲一区欧美激情| 91久久夜色精品国产九色| 久久久久欧美精品| 国产欧美视频一区二区三区| 一区二区三区日韩欧美精品| 欧美国产一区二区| 久久国产精品久久w女人spa| 国产精品久久久久久久久果冻传媒| 亚洲精品一二三区| 亚洲第一精品夜夜躁人人躁| 久久精品一区| 狠狠色狠狠色综合日日五| 久久久91精品国产| 亚洲在线一区| 欧美亚洲第一页| 亚洲一区二区精品| 99视频精品| 欧美日韩亚洲精品内裤| 亚洲精品中文字幕在线| 亚洲国产成人av| 免费永久网站黄欧美| 亚洲国产成人一区| 欧美电影在线观看| 美日韩精品视频| 在线精品国产欧美| 蜜桃久久精品乱码一区二区| 久久精品亚洲一区二区| 娇妻被交换粗又大又硬视频欧美| 久久久99精品免费观看不卡| 午夜精品国产| 国内精品免费在线观看| 麻豆91精品91久久久的内涵| 久久久国产亚洲精品| 亚洲电影下载| 亚洲国产精品悠悠久久琪琪| 欧美激情亚洲|