?本来打算下班回来就写这个东西,一方面算是对今天学习的一个笔记记录,另外一方面,给一些朋友普及一些swf文件加密基础知识。之所以说是基础,那是因为我也是刚学习了一点,灰常的基础。不过晚上看了一会我是传奇的视频耽误了,话说郭德纲老是调戏谢楠,难道有基情?不解释,呵呵……
? ? 在说明加密解密方法之前,先解释一些理论方面的东西,很草根。
? ??swf加密的目的。其实无论是flash的swf文件加密,还是其他各种加密,目的都是很简单,就是私心,不想泄露具体文件细节。当然这也是大环境趋势,在中国很多拿来主义,大家懂得。swf文件的加密,主要目的我分为两个:
? ? 1.flash代码加密,比如商业游戏的代码,被盗用总是不好。
? ? 2.flash素材加密,防止被一些工具破解盗用,用flash做动画的朋友应该深有体会。
? ??文件格式。什么是文件格式,百度百科是这样介绍:文件格式(或文件类型)是指电脑为了存储信息而使用的对信息的特殊编码方式,是用于识别内部储存的资料。简单点理解,所有的文件都是二进制数据,而特定格式的文件(比如图片文件、视频文件等)都是按照一定规律排列的二进制数据,只不过后面会加类似“.swf”这样的后缀加以辨识。
? ? 这样的话,针对上面swf加密目的,加密的理论方法自然就诞生了。
? ??swf加密的方式。
? ? 如果是加密代码,那么就用一些工具做代码混淆,降低可读性,即使破解了,也看不懂,那就白破解了。网上有一些工具比较适用,比如doswf。
? ? 如果是加密素材,那就需要破坏文件,让破解工具无法解析数据,这样就能保护文件。破坏文件,就是破坏二进制数据,破坏上面所说的文件格式。当然也不能随便破坏,因为一旦文件破坏,不但别人无法破解你的文件,自己的文件也无法正常运行,就本末倒置了。所以,需要有规律性的破坏,这个破坏方式也就是一些加密算法。
? ? 那么,现在自己的文件是被加密被破坏了,但是也没法用了,为了达到正常使用的目的,我们需要另外一个程序,即是解密算法。解密算法是跟加密算法正好相逆,一个破坏文件,一个修复文件,以达到正常使用的目的。
? ? (注:前面的几段还是上周六写的,后来不小心,脚被石头砸了一下,虽说没有血肉模糊,但还是比较疼,这里也提醒各位朋友,怀里揣着石头的,该放的时候早放,放晚了,就砸脚了……继续接着写吧)
? ???所以,目前我能想到的加密方法是,子文件要同时做混淆代码和加密文件两个步骤,而主文件内,要带有解密代码,同时要混淆这一段代码,防止被破解。
? ? 用一个小例子演示一下。这里我先用flash随便做个小动画,里面是一张图,生成的文件我命名为“未命名-1.swf”。这里,这个小动画就是子文件,现在我要对它加密。
? ? 现在新建一个类EncryptTool.as,他的作用就是对这个动画加密。这里要注意的是,因为要加密文件,就会涉及本地文件读写操作,普通flash player是不支持的,需要建立AIR工程运行。
? ? 摘取部分代码解释一下加密过程。
- _urlLoader = new URLLoader();
- _urlLoader.dataFormat = URLLoaderDataFormat.BINARY;
复制代码
? ? (不知道怎么回事,代码放上去总是会自动去掉后面的,我就直接写外面吧)
? ???_urlLoader.addEventListener(Event.COMPLETE,loaded);
? ???_urlLoader.load(new URLRequest("未命名-1.swf"));
? ? 上面这段代码意思就是把这个动画以二进制数据方式加载读取,然后加载完成后,会触发下面这个方法。
private function loaded(e:Event):void
{
? ?_urlLoader.removeEventListener(Event.COMPLETE,loaded);
? ?var data:ByteArray = _urlLoader.data as ByteArray; //用二进制数组保持读取的数据
? ?var key:String = "this is a test"; //我们设定密码key为这串字符
? ?var keyBytes:ByteArray = new ByteArray();
? ?keyBytes.writeObject(key); //把这串字符转换为二进制数组
? ?//下面就是加密算法
? ?var p:int??= data.length / 2; //获取原始数据中间的位置索引
? ?var b1:ByteArray = new ByteArray();
? ?for(var i:int = 0; i < keyBytes.length; i ++){
? ?? ?b1.writeByte(data[i + p] ^ keyBytes[i])
? ?}
? ?//上面的这段循环,主要意思是,把密码数据跟原始数据做一次运算,即从原始数据中间位置,取跟密码数据相同字节数的数据,他们做一次异或运算,然后把运算结果存储到一个二进制数组中。
? ?//不知道什么是异或运算的,百度一下,其实我也是刚查的……
? ?data.position = p; //把原始数据位置调整到中间位置
? ?data.writeBytes(b1); //从中间位置,把刚才运算后的数据全部替换进去
? ?//上面中间就是加密的过程,这个稍微有点麻烦了。也有更简单的,比如把首位字节对调等等。
? ?//上面数据加密过了,现在需要把这串加密后的数据保存成一个文件,为了方便,依然保存为swf文件。
? ?var file:File = new File("C:/Documents and Settings/user/桌面/加密解密/DecryptTool/src/mc.swf");
? ?var fs:FileStream = new FileStream();
? ?fs.open(file,FileMode.WRITE);
? ?fs.writeBytes(data);
? ?fs.close();
复制代码