zoukankan      html  css  js  c++  java
  • webgame开发中的文件加密

    一般的webgame中都会对资源、消息进行加密,这里只是简单记录一下对文件的加密过程。

    image

    上图为实际项目中所使用的加密工具(较为简单的一个air项目)

    输入加密key +  需要加密的文件  --> 加密 –> 将加密后的文件保存至另一目录(后缀名视自己的项目的规则进行修改)

    实现步骤:

    1、读取文件(flash.filesystem.File),获取文件流(flash.filesystem.FileStream),获取文件的二进制流(flash.util.ByteArray)

    2、对二进制数据进行加密(混淆一下)

    3、保存加密后的二进制数据

       1: var file:File = new File(path);
       2: //file.isDirectory == false && file.exists
       3:  
       4: var fs:FileStream = new FileStream();
       5: var bytes:ByteArray = new ByteArray();
       6: fs.open(file, FileMode.READ);   //只读模式
       7: fs.position = 0;
       8: fs.readBytes(bytes, 0, fs.bytesAvailable);
       9: fs.close();
      10:  
      11:  
      12: var tempFileName:String = "xxx"; //要保存的文件完整路径
      13: var tempFile:File = new File(tempFileName);
      14: if (tempFile.exists)
      15: {
      16:     tempFile.deleteFile();
      17:     
      18:     tempFile =  new File(tempFileName); 
      19: }
      20:  
      21: var tempFS:FileStream = new FileStream();
      22: tempFS.open(tempFile, FileMode.WRITE);
      23: tempFS.writeBytes(encrypt(bytes));   //加密数据
      24: tempFS.close();
      25:  
      26:  
      27: //encrypt..
      28: var pos:int = 0;
      29: var outByteArray:ByteArray = new ByteArray();
      30: var key:String = StringUtil.trim(keyTxt.text);
      31:  
      32: for (var i:int = 0, len:int = byte.length; i < len; i++)
      33: {
      34:    //todo...
      35:     
      36:     outByteArray.writeByte(byte[i] + //.....);
      37: }
      38:  
      39: return outByteArray;

    主要的示例代码(加密方法已被隐去>_<):

       1: <?xml version="1.0" encoding="utf-8"?>
       2: <mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" width="100%" height="100%"
       3:          horizontalScrollPolicy="off" verticalScrollPolicy="off">
       4:     
       5:     <mx:Script>
       6:         <![CDATA[
       7:             import mx.controls.Alert;
       8:             import mx.utils.StringUtil;
       9:             
      10:             private var filePath:String;
      11:             private var directoryPath:String;
      12:             
      13:             private function encryptHandler():void
      14:             {
      15:                 if (!filePath && !directoryPath)
      16:                 {
      17:                     Alert.show("请先选择要加密的文件或目录", "错误");
      18:                     return ;
      19:                 }
      20:                 
      21:                 var key:String = StringUtil.trim(keyTxt.text);
      22:                 
      23:                 if (key == "")
      24:                 {
      25:                     Alert.show("加密KEY不能为空", "错误");
      26:                     return ;
      27:                 }
      28:                 
      29:                 encryptBtn.enabled = false;
      30:                 
      31:                 if (!(!filePath))
      32:                 {
      33:                     encryptFileHandler(filePath);
      34:                     
      35:                     Alert.show("文件“"+filePath+"”加密完成", "温馨提示");
      36:                 }
      37:                 else if (!(!directoryPath))
      38:                 {
      39:                     encryptDirectoryHandler(directoryPath);
      40:                     
      41:                     Alert.show("目录“"+directoryPath+"”文件加密完成", "温馨提示");
      42:                 }
      43:                 
      44:                 outputTxt.validateNow();
      45:                 
      46:                 encryptBtn.enabled = true;
      47:             }
      48:             
      49:             private function getTypeFilter():FileFilter
      50:             {
      51:                 var str:String = "*.swf;*.jpg;*.png;*.xml;*.zip";
      52:                 
      53:                 var filter:FileFilter = new FileFilter("资源("+str+")", str);
      54:                 
      55:                 return filter;
      56:             }
      57:             
      58:             private function selectFileHandler():void
      59:             {
      60:                 var file:File = new File();
      61:                 file.addEventListener(Event.SELECT, selectFileCallback);
      62:                 file.browseForOpen("请选择一个文件", [getTypeFilter()]);
      63:             }
      64:             
      65:             private function selectFileCallback(evt:Event):void
      66:             {
      67:                 clear();
      68:                 
      69:                 var file:File = File(evt.target);
      70:                 file.removeEventListener(Event.SELECT, selectFileCallback);
      71:                 
      72:                 filePath = file.nativePath;
      73:                 
      74:                 inputTxt.htmlText = "选择的文件路径:" + filePath;
      75:             }
      76:             
      77:             private function selectDirectoryHandler():void
      78:             {
      79:                 var file:File = new File();
      80:                 file.addEventListener(Event.SELECT, selectDirectoryCallback);
      81:                 file.browseForDirectory("请选择一个目录");
      82:             }
      83:             
      84:             private function selectDirectoryCallback(evt:Event):void
      85:             {
      86:                 clear();
      87:                 
      88:                 directoryPath = File(evt.target).nativePath;
      89:                 
      90:                 inputTxt.htmlText = "选择的目录路径:" + directoryPath;
      91:                 
      92:                 File(evt.target).removeEventListener(Event.SELECT, selectDirectoryCallback);
      93:             }
      94:             
      95:             private function getEncryptSuffix(fileType:String):String
      96:             {
      97:                 var typeConfig:Object = {
      98:                     'swf' : 's',
      99:                     'jpg' : 'j',
     100:                     'png' : 'p',
     101:                     'xml' : 'x',
     102:                     'zip' : 'z'
     103:                 };
     104:                 
     105:                 if (!typeConfig[fileType])
     106:                 {
     107:                     return fileType;
     108:                 }
     109:                 
     110:                 return typeConfig[fileType];
     111:             }
     112:             
     113:             private function clear():void
     114:             {
     115:                 inputTxt.htmlText = "";
     116:                 outputTxt.htmlText = "";
     117:                 
     118:                 filePath = null;
     119:                 directoryPath = null;
     120:             }
     121:             
     122:             private function encryptFileHandler(path:String):void
     123:             {
     124:                 var file:File = new File(path);
     125:                 
     126:                 if (file.isDirectory == false && file.exists)
     127:                 {
     128:                     maskPanel.visible = true;
     129:                     
     130:                     var fs:FileStream = new FileStream();
     131:                     var bytes:ByteArray = new ByteArray();
     132:                     
     133:                     fs.open(file, FileMode.READ);
     134:                     fs.position = 0;
     135:                     fs.readBytes(bytes, 0, fs.bytesAvailable);
     136:                     fs.close();
     137:                     
     138:                     loadFileCompleteHandler(file, bytes);
     139:                     
     140:                     maskPanel.visible = false;
     141:                 }
     142:                 else
     143:                 {
     144:                     outputTxt.htmlText += "<br>【error】" + path + "不是一个正确的文件路径!";
     145:                 }
     146:             }
     147:             
     148:             private function encryptDirectoryHandler(path:String):void
     149:             {
     150:                 var file:File = new File(path);
     151:                 
     152:                 if (file.exists && file.isDirectory)
     153:                 {
     154:                     var fileList:Array = file.getDirectoryListing();
     155:                     var typeArr:Array = ["swf", "zip", "xml", "jpg", "png"];
     156:                     
     157:                     for (var i:int = 0, len:int = fileList.length; i < len; i++)
     158:                     {
     159:                         var tempFile:File = File(fileList[i]);
     160:                         var tempFilePath:String = tempFile.nativePath;
     161:                         
     162:                         if (tempFile.isDirectory == false)
     163:                         {
     164:                             if (typeArr.indexOf(tempFile.extension) > -1)
     165:                             {
     166:                                 encryptFileHandler(tempFilePath);    
     167:                             }
     168:                             else
     169:                             {
     170:                                 outputTxt.htmlText += "<br><font color='#ff0000'>【skip】跳过文件:"+tempFilePath+"</font>";                        
     171:                             }
     172:                         }
     173:                         else if (tempFile.name != ".svn")
     174:                         {
     175:                             encryptDirectoryHandler(tempFilePath);
     176:                         }
     177:                     }
     178:                 }
     179:                 else
     180:                 {
     181:                     outputTxt.htmlText += "<br>【error】" + path + "不是一个正确的目录路径!";
     182:                 }
     183:             }
     184:             
     185:             private function loadFileCompleteHandler(file:File, bytes:ByteArray):void
     186:             {
     187:                 outputTxt.htmlText += "<br>开始加密文件" + file.nativePath;
     188:                 
     189:                 var tempFileName:String = file.parent.nativePath + "\\" + file.name.replace(new RegExp(file.extension + "$"), "") + getEncryptSuffix(file.extension);
     190:                 
     191:                 tempFileName = tempFileName.replace(/\\abc\\/, '\\encrypt_abc\\abc\\');
     192:                 
     193:                 var tempFile:File = new File(tempFileName);
     194:                 
     195:                 if (tempFile.exists)
     196:                 {
     197:                     tempFile.deleteFile();
     198:                     
     199:                     tempFile =  new File(tempFileName); 
     200:                 }
     201:                 
     202:                 var tempFS:FileStream = new FileStream();
     203:                 tempFS.open(tempFile, FileMode.WRITE);
     204:                 tempFS.writeBytes(encrypt(bytes));
     205:                 tempFS.close();
     206:             }
     207:             
     208:             private function encrypt(byte:ByteArray):ByteArray
     209:             {
     210:                 var pos:int = 0;
     211:                 var outByteArray:ByteArray = new ByteArray();
     212:                 var key:String = StringUtil.trim(keyTxt.text);
     213:                 //todo...               
     214:                 
     215:                 return outByteArray;
     216:             }
     217:             
     218:         ]]>
     219:     </mx:Script>
     220:     
     221:     <mx:VBox width="100%" height="100%" 
     222:              horizontalScrollPolicy="off" verticalScrollPolicy="off"
     223:              paddingLeft="10" paddingRight="10" paddingTop="10" paddingBottom="10">
     224:         
     225:         <mx:HBox width="100%" height="50" horizontalScrollPolicy="off" verticalScrollPolicy="off"
     226:                  verticalAlign="middle">
     227:             
     228:             <mx:Label text="加密KEY" />
     229:             <mx:TextInput  id="keyTxt" width="300" text="abc123" />
     230:             <mx:Button label="加密" id="encryptBtn" click="encryptHandler()" />
     231:             <mx:Spacer width="100%" />
     232:             
     233:             <mx:Button id="selectFileBtn" click="selectFileHandler()" label="选择文件" />
     234:             <mx:Button id="selectDirectoryBtn" click="selectDirectoryHandler()" label="选择文件夹" />
     235:             
     236:         </mx:HBox>
     237:         
     238:         <mx:HBox width="100%" height="100%" horizontalScrollPolicy="off" verticalScrollPolicy="off">
     239:             
     240:             <mx:TextArea id="inputTxt" width="100%" height="480" leading="5" letterSpacing="1"
     241:                          borderColor="#eeeeee" borderStyle="solid" 
     242:                          paddingTop="5" paddingRight="5" paddingLeft="5" paddingBottom="5" />
     243:             
     244:             <mx:TextArea id="outputTxt" width="100%" height="480" leading="5" letterSpacing="1"
     245:                          borderColor="#eeeeee" borderStyle="solid" 
     246:                          verticalScrollPolicy="auto"
     247:                          paddingTop="5" paddingRight="5" paddingLeft="5" paddingBottom="5" />
     248:             
     249:         </mx:HBox>
     250:     
     251:     </mx:VBox>
     252:     
     253:     <mx:Canvas width="100%" height="100%" backgroundColor="#000000" backgroundAlpha=".3" visible="false" id="maskPanel">
     254:         <mx:HBox width="130" height="50" horizontalCenter="0" verticalCenter="0" 
     255:                  backgroundColor="#ffffff" verticalAlign="middle" horizontalAlign="center">
     256:             <mx:Text horizontalCenter="0" verticalCenter="0" text="正在处理..." fontSize="16" fontWeight="bold" color="#3399cc"  />            
     257:         </mx:HBox>
     258:     </mx:Canvas>
     259:     
     260: </mx:Canvas>
  • 相关阅读:
    ASP.net2.0中的特殊文件App_global.asax.compiled
    Enterprise Library 2.0中log文件大小设置
    尝试读取或写入受保护的内存,这通常指示其它内存已损坏
    没有钱的生活
    如何把java项目打包成war包
    常用的正则表达式
    最简单的oracle10g手工建库步骤
    rman复制数据库ORA01547ORA01194ORA01110,强制打开并修改日志文件
    oracle 10g 的max函数的bug
    PL/SQL Developer 使用错误的tnsnames.ora,如何修改?
  • 原文地址:https://www.cnblogs.com/meteoric_cry/p/2433782.html
Copyright © 2011-2022 走看看