webgame开发中的文件加密

简介: 一般的webgame中都会对资源、消息进行加密,这里只是简单记录一下对文件的加密过程。   上图为实际项目中所使用的加密工具(较为简单的一个air项目)   输入加密key +  需要加密的文件  --> 加密 –> 将加密后的文件保存至另一目录(后缀名视自己的项目的规则进行修改) 实现步骤: 1、读取文件(flash.

一般的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>
目录
相关文章
|
10月前
|
数据采集 监控 API
加密货币 Pump 监测刮刀工具开发原理及实现路径
开发Pump监测刮刀工具需综合运用高频数据采集、波动率建模、跨平台对冲三大核心技术,2025年的技术瓶颈已从基础数据获取转向超低延迟执行与合规适配。建议采用模块化开发策略,优先实现核心监控功能,再逐步接入AI决策与链上套利模块。代码示例需根据最新交易所API文档动态调整,并严格遵守所在地监管法规。
|
12月前
|
安全 网络协议 算法
零基础IM开发入门(五):什么是IM系统的端到端加密?
本篇将通俗易懂地讲解IM系统中的端到端加密原理,为了降低阅读门槛,相关的技术概念会提及但不深入展开。
447 2
|
安全 网络安全 Android开发
安卓与iOS开发:选择的艺术网络安全与信息安全:漏洞、加密与意识的交织
【8月更文挑战第20天】在数字时代,安卓和iOS两大平台如同两座巍峨的山峰,分别占据着移动互联网的半壁江山。它们各自拥有独特的魅力和优势,吸引着无数开发者投身其中。本文将探讨这两个平台的特点、优势以及它们在移动应用开发中的地位,帮助读者更好地理解这两个平台的差异,并为那些正在面临选择的开发者提供一些启示。
236 56
|
NoSQL Java Redis
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
这篇文章介绍了如何使用Spring Boot整合Apache Shiro框架进行后端开发,包括认证和授权流程,并使用Redis存储Token以及MD5加密用户密码。
452 0
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
|
JavaScript 前端开发 安全
安全开发-JS应用&原生开发&JQuery库&Ajax技术&加密编码库&断点调试&逆向分析&元素属性操作
安全开发-JS应用&原生开发&JQuery库&Ajax技术&加密编码库&断点调试&逆向分析&元素属性操作
241 5
|
安全 网络安全 数据安全/隐私保护
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享安卓与iOS开发中的线程管理比较
【8月更文挑战第30天】本文将探讨网络安全与信息安全的重要性,并分享关于网络安全漏洞、加密技术和安全意识的知识。我们将了解常见的网络攻击类型和防御策略,以及如何通过加密技术和提高安全意识来保护个人和组织的信息安全。
|
安全 网络安全 量子技术
网络安全与信息安全:漏洞、加密技术与安全意识的探索安卓应用开发中的内存管理策略
【5月更文挑战第31天】随着互联网的普及,网络安全问题日益严重。本文将深入探讨网络安全漏洞、加密技术以及安全意识等方面的问题,以期提高公众对网络安全的认识和防范能力。
|
存储 安全 算法
【PHP开发专栏】PHP加密与解密技术
【4月更文挑战第29天】本文探讨了PHP中的加密解密技术,涵盖基本概念如对称加密(AES、DES)、非对称加密(RSA、DSA)和哈希函数(MD5、SHA)。PHP提供内置函数支持加密,如`openssl_encrypt`、`openssl_pkey_new`、`hash`和`password_hash`。文章强调了最佳实践,如使用安全密钥、密钥管理和HTTPS,并给出用户注册登录的加密实战示例。通过理解和应用这些技术,开发者能增强Web应用的数据安全性。
457 1
|
JavaScript 前端开发 关系型数据库
金融技术解决方案:用Python和Vue开发加密货币交易平台
【4月更文挑战第11天】本文介绍了如何使用Python和Vue.js构建加密货币交易平台。首先确保安装了Python、Node.js、数据库系统和Git。后端可选择Flask或Django框架,通过RESTful API处理交易。前端利用Vue.js、Vuex和Vue Router创建用户友好的界面,并用Axios与后端通信。这种架构促进团队协作,提升代码质量和平台功能。
413 0
|
算法 C# 数据安全/隐私保护
C# | 上位机开发新手指南(十)加密算法——ECC
本篇文章我们将继续探讨另一种非对称加密算法——ECC。 严格的说,其实ECC并不是一种非对称加密算法,它是一种基于椭圆曲线的加密算法,广泛用于数字签名和密钥协商。 与传统的非对称加密算法(例如RSA)不同,ECC算法使用椭圆曲线上的点乘法来生成密钥对和进行加密操作,而不是使用大数分解等数学算法。这使得ECC算法具有相同的安全性和强度,但使用更少的位数,因此在资源受限的环境中具有优势。 ECC算法虽然使用公钥和私钥进行加密和解密操作,但是这些操作是基于点乘法实现的,而不是基于大数分解等算法实现的。因此,ECC算法可以被视为一种非对称加密算法的变体,但是它与传统的非对称加密算法有所不同。
825 0
C# | 上位机开发新手指南(十)加密算法——ECC