您的位置:首页 > 编程语言 > PHP开发

as3.0利用DES和AES对数据进行加密和解密并且与php端加密匹配!

2012-11-17 09:14 1046 查看
前一段时间需要对数据进行一些加密,曾经在论坛里发帖问过这个问题!后来经过自己百度和看书等途径把它搞掂了! 今天又看到有人需要就分享一下吧! 觉得可以的就顶吧! 好了,废话不说了看代码!

首先看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是可有可无的!

好了最后希望本贴对大家有帮助

完!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: