byteArray的加密原理

byteArray的加密原理是,先用:URLLoader把swf文件加載進(jìn)來(lái),得到URLLoader的data屬性(byteArray類(lèi)型),然后把這個(gè)byteArray數(shù)組進(jìn)行分解,得到一個(gè)8位的字節(jié)流。然后對(duì)這個(gè)字節(jié)流進(jìn)行位移(也就是加密的數(shù)字,文章中用的是+13),最后得到一個(gè)新的字節(jié)流數(shù)組,進(jìn)行保存。

解密的方法也是如此:先把文件導(dǎo)入進(jìn)來(lái),得到byteArray,分解成8位的字節(jié)流,(解密方法就是對(duì)字節(jié)流進(jìn)行反位移,也就是加密是+13,解密就是-13),這樣生成新的字節(jié)流數(shù)組就是可以使用的swf文件了。

這樣加密也暴露了只能采用數(shù)字加密的問(wèn)題,然而更大的問(wèn)題是:加密最核心的原理是對(duì)字節(jié)流(8位)的加密,因?yàn)槭?位的,范圍只能是:0~255之間,那么你采用超過(guò)255的數(shù)字加密也是會(huì)取余成255的,不信你用256這個(gè)數(shù)字加密看看,得到的是什么?竟然是加密后的swf,和原來(lái)的swf是一致的,原因就是256會(huì)變成0,你位移+0,那當(dāng)然是等于沒(méi)有變啦。因?yàn)檫@種加密方式生成的加密文件只能有256種,那么我麻煩點(diǎn)在0~255間一個(gè)個(gè)地試就能得到解密的swf。

為此可以改進(jìn)加密算法,使用字符串作為密文。把字符串轉(zhuǎn)為一個(gè)ASCII數(shù)組(如”abc”,對(duì)應(yīng)的ASCII數(shù)組為97,98,99),然后與文件的字節(jié)流數(shù)組進(jìn)行循環(huán)加密。如一個(gè)1K的swf,那么它有1024個(gè)字節(jié)流,第一個(gè)字節(jié)流與97進(jìn)行位移,第二個(gè)與98位移,第三個(gè)與99,第四個(gè)又循環(huán)與97加。這樣生成的加密文件就無(wú)窮多了。解密的方法也只有拿到密文才能進(jìn)行解密。

下面是加解密方法:

//加密函數(shù)

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;

}

 

//解密函數(shù)

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;

}