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

解密的方法也是如此:先把文件导入进来,得到byteArray,分解成8位的字节流,(解密方法就是对字节流进行反位移,也就是加密是+13,解密就是-13),这样生成新的字节流数组就是可以使用的swf文件了。

这样加密也暴露了只能采用数字加密的问题,然而更大的问题是:加密最核心的原理是对字节流(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;

}