【转载】swf 加密:采用byteArray 方式,增加字符串加密,可加密大文件swf

转载自:http://www.91face.com/blog/?p=206

 

先把工具传上来先。

http://www.91face.com/swf/entryptSwf.swf

 

解密的fla:http://91face.com/swf/loader.fla

使用方法:1.把cba.swf用“abcdef”密文加密,生成abc.swf。2.打开loader.fla(与加密后的abc.swf目录一致),就可以解密,并看到正常的swf文件了。

今天需要用到swf加密,其实我个人来说不是很喜欢加密,flash的精彩源于社区高手的贡献,很多珍贵的代码都可以免费使用,我现做的项目有很多是采用第三方的类库。今天既然项目需要加密的话就加吧,于是试用了好几种现在流行的加密方法:
第一种是使用”swf encrypt”、或者doSWF软件加密,个人认为swf encrypt 的加密不太好,原因不是它算法不够强或者什么的,而是闪客精灵等破解软件会专门针对它的加密算法进行破解。这会导致您加密不久的swf又遭人破了,doSwf是国人写的,还真不错,我试了下加密得很好,连movieClip都看不到。还真想了解下doSwf的加密原理(^.^),现在doSwf是要收费的一年200元,其实钱不是问题(不是我吹牛,至少对于公司来说是这样),钱能解决的问题都不是问题。但是…..(来了:)! ,dowSwf加密大文件的swf有问题,我用我们公司的游戏项目,一个1M左右的swf,加密会出错。所以这种方法对于现有的项目不可行。
第二种方法是采用byteArray二进制加密,此种方法不会使swf变大,只是在原有的字节流中做混淆,对闪客精灵等软件可以起到很好的防破解作用。网上又有源码可以很好地做研究。网址:http://bbs.blueidea.com/thread-2900310-1-97.html 。但是此方法有一个弊端,就是需要一个解密的swf(下面会说到),解密中的密文还是会暴露。

衡量了两种方法后准备用第二种,因为简单又可以达到效果。使用后觉得写此加密方法的作者应该是在flash player9是写的,采用的还是用php来生成加密后的swf文件,这样使用起来非常的不便,因为还要布置php的运行环境。因为flash10的:FileReference类可以本地获取与保存二进制数据了。所以决定对其进行改进。

说得此,我先分析下byteArray的加密原理:
byteArray的加密原理是,先用:
URLLoader把swf文件加载进来,得到
URLLoader的data属性(byteArray类型),然后把这个byteArray数组进行分解,得到一个8位的字节流。然后对这个字节流进行位移(也就是加密的数字,文章中用的是+13),最后得到一个新的字节流数组,进行保存。

解密的方法也是如此:先把文件导入进来,得到byteArray,分解成8位的字节流,(解密方法就是对字节流进行反位移,也就是加密是+13,解密就是-13),这样生成新的字节流数组就是可以使用的swf文件了。说到此我不得不佩服原文作者对byteArray机制的理解,不知是否是自己对加密了解甚少,我就是觉得能这样加密就是强(o_o)!(肯定有人笑我了,哈哈)。

这样加密也暴露了只能采用数字加密的问题,后来我又发现一个比较大的问题,就是:加密最核心的原理是对字节流(8位)的加密,因为是8位的,范围只能是:0~255之间,那么你采用超过255的数字加密也是会取余成255的,不信你用256这个数字加密看看,得到的是什么?竟然是加密后的swf,和原来的swf是一致的,原因就是256会变成0,你位移+0,那当然是等于没有变啦。因为这种加密方式生成的加密文件只能有256种,那么我麻烦点在0~255间一个个地试就能得到解密的swf。

为此我改进了加密算法,使用字符串作为密文。把字符串转为一个ASCII数组(如”abc”,对应的ASCII数组为97,98,99),然后与文件的字节流数组进行循环加密。如一个1K的swf,那么它有1024个字节流,第一个字节流与97进行位移,第二个与98位移,第三个与99,第四个又循环与97加。这样生成的加密文件就无穷多了。解密的方法也只有拿到密文才能进行解密。

下面公布加解密方法:

//加密函数
private function compress(byte:ByteArray):ByteArray{
var key:String = password.text; //得到密文

var flag:int = 0;
var newByte:ByteArray = new ByteArray();
/* */
for(var i:int = 0; i<byte.length ; i++ ,flag++){
if(flag >= key.length){
flag = 0;
}
newByte.writeByte(byte[i] + key.charCodeAt(flag));
//newByte.writeByte(byte[i] + 256);
}
//输出
fileByteArray = newByte;
saveBtn.visible = true;
return newByte;
}

//解密函数
private function uncompress(byte:ByteArray):ByteArray{
var key:String = password.text; //得到密文
var flag:int = 0;

var newByte:ByteArray = new ByteArray();
/* */
for(var i:int = 0; i<byte.length ; i++ ,flag++){
if(flag >= key.length){
flag = 0;
}
newByte.writeByte(byte[i] – key.charCodeAt(flag));
//newByte.writeByte(byte[i] + 256);
}
//trace(newByte);
fileByteArray = newByte;
saveBtn.visible = true;
return newByte;
}



源文件(flex):http://www.91face.com/swf/entryptSwf.mxml

最后问题是解密的swf,还是会暴露代码。如a.swf把encrypt.swf加载进来后,虽然这个encrypt.swf看不到了,但a.swf还是未加密的,好在此时a.swf会比较小,可以用doSwf加密。doSwf未授权版本也可以绕过,删除其水印与删除其定时弹出的链接。为尊重作者劳动成果,故不公布代码。大家还是去doSwf的网站上购买吧,真希望有一天doSwf也能公布其加密方法,到那时swf加密又会上一个新的台阶了!

最后说句,本人因为平时极少写博客,文字组织能力太差,错别字太多。(555)晚了,回家吧!!!

 

转载自:http://www.91face.com/blog/?p=206

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值