揭開加密算法的神秘面紗

此前我們介紹過很多種加密方法,但是有一種加密方法我們卻從沒有說過,那么今天我們講揭開swf文件加密方法的神秘面紗。

目前幾種流行的加密方法:
第一種是使用”swf encrypt”、或者doSWF軟件加密,個(gè)人認(rèn)為swf encrypt 的加密不太好,原因不是它算法不夠強(qiáng)或者什么的,而是閃客精靈等破解軟件會(huì)專門針對它的加密算法進(jìn)行破解。這會(huì)導(dǎo)致您加密不久的swf又遭人破了,doSwf是國人編寫的,加密得很好,連movieClip都看不到。dowSwf加密大文件的swf有問題,一個(gè)1M左右的swf,加密會(huì)出錯(cuò)。

第二種方法是采用byteArray二進(jìn)制加密,此種方法不會(huì)使swf變大,只是在原有的字節(jié)流中做混淆,對閃客精靈等軟件可以起到很好的防破解作用。網(wǎng)上又有源碼可以很好地做研究。網(wǎng)址:http://bbs.blueidea.com/thread-2900310-1-97.html 。但是此方法有一個(gè)弊端,就是需要一個(gè)解密的swf(下面會(huì)說到),解密中的密文還是會(huì)暴露。

我先分析下byteArray的加密原理:

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

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

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

為此可以改進(jìn)加密算法,使用字符串作為密文。把字符串轉(zhuǎn)為一個(gè)ASCII數(shù)組(如”abc”,對應(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加。這樣生成的加密文件就無窮多了。解密的方法也只有拿到密文才能進(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;
}

如果是自己的播放器的話,可以采用更多的加密方法了,如利用AES加密。

利用AES加密方式對swf格式文件進(jìn)行整體加密,從而防止當(dāng)今流行的反編譯軟件的攻擊。同時(shí)能在加密時(shí)指定文件的使用期限(即過期時(shí)間)。在播放文件之前播放器會(huì)提示密碼輸入以及過期提醒。在關(guān)閉播放器時(shí)會(huì)清除硬盤上的臨時(shí)數(shù)據(jù)以防止泄漏。