as3.0利用DES和AES对数据进行加密和解密并且与php端加密匹配!
前一段时间需要对数据进行一些加密,曾经在论坛里发帖问过这个问题!后来经过自己百度和看书等途径把它搞掂了! 今天又看到有人需要就分享一下吧! 觉得可以的就顶吧! 好了,废话不说了看代码!
首先看AS3端的,主要是利用as3.0Crypto包来完成的,谷歌下载地址:http://code.google.com/p/as3cryp ... ail?name=Crypto.zip
DES加密的例子:
var str2:String = '12345678'; //key和 iv可以自己定义不同的 var key:ByteArray = new ByteArray(); key.writeUTFBytes(str2); var iv:ByteArray= new ByteArray(); iv.writeUTFBytes(str2); var des:DESKey = new DESKey(key); var cbc:CBCMode = new CBCMode(des); //加密模式,有多种模式供你选择 cbc.IV = iv; //设置加密的IV /* 得到的密文长度和明文的长度有关,规律大致是:明文<8 密文=12 ,明文<16 密文=24 ,明文>=16 密文=32......后面希望你们推一下*/ var plain:String = "123456789"; //明文 var tmpByteArray:ByteArray = convertStringToByteArray(plain); //转换成二进制编码 (该函数自己定义) cbc.encrypt(tmpByteArray); //利用加密模式对数据进行加密 var as3Str:String = Base64.encodeByteArray(tmpByteArray); //利用base64对密文进行编码 trace("as3Str = "+as3Str);//输出结果 为: PXWVqYv/gJ04WpM5vlT9gg== //String转ByteArray函数 public function convertStringToByteArray(str:String):ByteArray { var bytes:ByteArray; if (str) { bytes=new ByteArray(); bytes.writeUTFBytes(str); } return bytes; }
as3的就是这么多,是不是很简单,其实就是用别人弄好的代码
好了看看php端代码 :
主要是利用mcrypt函数,很多书都有介绍,其实看帮助文档就可以明白了!
//as3的和php的key和IV要一致,并且只能食8个字节长度 $key="12345678"; $iv="12345678"; $encrypt='123456789'; //明文 $tb=mcrypt_module_open(MCRYPT_3DES,'','cbc',''); //创建加密环境 256位 128/8 = 16 字节 表示IV的长度 mcrypt_generic_init($tb,$key,$iv); //初始化加密算法 $encrypt=PaddingPKCS7($encrypt);//这个函数非常关键,其作用是对明文进行补位填充 $cipher=mcrypt_generic($tb,$encrypt); //对数据执行加密 $cipher=base64_encode($cipher);//同意进行base64编码 mcrypt_generic_deinit($tb); //释放加密算法资源 mcrypt_module_close($tb); //关闭加密环境 //补位填充函数 function PaddingPKCS7 ($data) { /* 获取加密算法的区块所需空间,MCRYPT_3DES表示加密算法,cbc表示加密模式,要和mcrypt_module_open(MCRYPT_3DES,'','cbc','')的一致*/ $block_size = mcrypt_get_block_size(MCRYPT_3DES, 'cbc'); echo ' block_size = '.$block_size.' = '; $padding_char = $block_size - (strlen($data) % $block_size); // 计算需要补位的空间 $data .= str_repeat(chr($padding_char), $padding_char); // 补位操作 return $data; } echo $encrypt.' 加密后= '.$cipher.'<br>'; //输出的结果也是 PXWVqYv/gJ04WpM5vlT9gg==
好了 代码就是这么多,需要的可以把它封装成类使用.还有就是AES加密,其实是和DES差不多,
as端把那个var des:DESKey = new DESKey(key); 替换成var aes:AESKey = new AESKey(key);就可以了
php端同样式把算法换一下就可以了,也就是 mcrypt_module_open("rijndael-128",'','cbc','')
//其中128bit表示iv的长度 128/8=16个字节,也可以是256的
但是在as3端是128的,注意as3的IV和key同样要和php的一致。
加密就这样完了,不知道你们看得明白不,因为我对自己的表达方式不是很大自信!
好再看看解密吧!,解密就是加密的相反过程
as3的代码:
tmpByteArray = Base64.decodeToByteArray(as3Str); //因为刚才加密的是把密文进行base64编码了,现在解码 cbc.decrypt(tmpByteArray); //利用加密模式的解密算法解码 var plain:String=convertByteArrayToString(tmpByteArray); //把二进制数据转换成字符串 函数代码如下 trace(" plain = "+plain); //输出明文 123456789 //ByteArray转String public function convertByteArrayToString(bytes:ByteArray):String { var str:String; if (bytes) { bytes.position=0; str=bytes.readUTFBytes(bytes.length); } return str; }
php的解码代码:
//解密 /* $tb=mcrypt_module_open(MCRYPT_3DES,'','cbc',''); mcrypt_generic_init($tb,$key,$iv); $cipher=base64_decode($cipher); $pain=mdecrypt_generic($tb,$cipher); mcrypt_generic_deinit($tb); mcrypt_module_close($tb); echo $pain; // 123456789
好加密和解密都说完了,另外多说一句,并非所以的加密模式都需要IV 其实CBC加密模式的IV是可有可无的!
好了最后希望本贴对大家有帮助
完!
I love program