设为首页 收藏本站
查看: 592|回复: 0

[经验分享] flash + php对称密钥加密的交互

[复制链接]
累计签到:29 天
连续签到:1 天
发表于 2017-4-1 12:43:47 | 显示全部楼层 |阅读模式
这几天研究了下php和flash中的对称密钥加密的交互问题,经过研究以后决定,在项目中使用aes加密。问题也就来了,在flash中的加密数据如何与php的amf进行数据交互,最终决定使用base64编码。
一、flash中的aes加密
这里使用的是官方的库as3crypto:一个as3的关于加解密的开源项目
http://code.google.com/p/as3crypto/
加解密类如下:

package org.randy.crypto
{
import com.hurlant.crypto.symmetric.AESKey;
import com.hurlant.crypto.symmetric.ECBMode;
import com.hurlant.crypto.symmetric.ICipher;
import com.hurlant.crypto.symmetric.IPad;
import com.hurlant.crypto.symmetric.PKCS5;
import com.hurlant.util.Base64;
import com.hurlant.util.Hex;
import flash.utils.ByteArray;
/**
* ...
* @author Randy
*/
public class Aes
{
private var _pad:IPad;//填充方式
private var _mode:ICipher;//加密类
/**
* 构造函数
* @parambase64keyString   密钥base64编码字符串
*/
public function Aes(base64keyString:String)
{
_pad = new PKCS5(); //为了与java保持一致,所以采用PKCS5填充
var key:ByteArray = Base64.decodeToByteArray(base64keyString);
_mode = new ECBMode(new AESKey(key), _pad);
_pad.setBlockSize(_mode.getBlockSize());
}

/**
* 将明文加密为密文base64编码字符串
* @paramplainSrc 明文
* @return密文base64编码
*/
public function encrypt(plainSrc:String):String
{
var src:ByteArray = Hex.toArray(Hex.fromString(plainSrc));
_mode.encrypt(src);
return Base64.encodeByteArray(src);
}

/**
* 将base64编码字符串(密文)解密成 明文
* @parambase64Src  密文base64编码字符串
* @return明文
*/
public function decrypt(base64Src:String):String
{
var src:ByteArray = Base64.decodeToByteArray(base64Src);
_mode.decrypt(src);
return Base64.decode(Base64.encodeByteArray(src));
}
/**
* 释放内存
*/
public function dispose():void
{
_mode.dispose();
_mode = null;
_pad = null;
}
}
}


测试类:
package  
{
import com.hurlant.util.Base64;
import flash.display.Sprite;
import org.randy.crypto.Aes;
/**
* ...
* @author Randy
*/
public class AesTest extends Sprite
{
private var _aes:Aes;
public function AesTest()
{
_aes = new Aes("MK2X82eL6jkKbzvlJU1ZMR6rcKO+SBhmbPOmFD/2Mxw=");
trace(_aes.encrypt("hello"));
trace(_aes.decrypt(_aes.encrypt("hello")));
}
}
}

输出如下:
pRkOF9V/Zj5Zca7atjWldA==
hello

二、php端
系统win7
由于使用的是EasyPhp5.38,没有带加密扩展,所以需要php4, 解压缩,将php4目录下的php4ts.dll拷贝到c:\windows\System32目录,将extensions目录下的php_mcrypt.dll拷贝至php5的ext目录下,并修改php.ini 加上extension=php_mcrypt.dll, 下载libmcrypt.dll,并拷贝至c:\windows\System32目录,重新启动easyphp
出现警告:
PHP Startup:SVWJ: Unable to initialize module
Module compiled wit module API=.........
直接忽略掉

<?php
class phpAes
{
private $td;//加密模块
private $key;//密钥
private $blocksize;
public function __construct($base64key)
{
//密钥
$this->key = base64_decode($base64key);
//打开模块
$this->td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', "ecb", '');
$this->blocksize = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, 'ecb');
$this->iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($this->td), MCRYPT_RAND);
}

public function __destruct()
{
mcrypt_module_close($this->td);
}

/**
* 将明文加密为密文base64编码字符串
* @paramplainSrc 明文
* @return密文base64编码
*/
public function encrypt($plainSrc)
{
$td = $this->td;
//初始化加密
mcrypt_generic_init($td, $this->key, $this->iv);
//加密
$encrypted = mcrypt_generic($td,$this->PaddingPKCS7($plainSrc));
//终止加密,主要是一些内存清理
mcrypt_generic_deinit($td);
//返回
return base64_encode($encrypted);
}
/**
* 将base64编码字符串(密文)解密成 明文
* @parambase64Src  密文base64编码字符串
* @return明文
*/
public function decrypt($base64Src)
{
$src = base64_decode($base64Src);
$td = $this->td;
//初始化解密
mcrypt_generic_init($td, $this->key, $this->iv);
//解密
$decrypted = mdecrypt_generic($td,$src);
//终止解密,主要是一些内存清理
mcrypt_generic_deinit($td);
//返回
return $this->UnPaddingPKCS7($decrypted);
}
//填充
private function PaddingPKCS7 ($data)
{
$block_size =  $this->blocksize;
$padding_char = $block_size - (strlen($data) % $block_size);
$data .= str_repeat(chr($padding_char), $padding_char);
return $data;
}
private function UnPaddingPKCS7($text)
{
$pad = ord($text{strlen($text) - 1});
if ($pad > strlen($text)) {
return false;
}
if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) {
return false;
}
return substr($text, 0, - 1 * $pad);
}
}
$aes = new phpAes("MK2X82eL6jkKbzvlJU1ZMR6rcKO+SBhmbPOmFD/2Mxw=");
$enc = $aes->encrypt("hello");
echo $enc."<br>";
echo $aes->decrypt($enc);
?>


程序输出
pRkOF9V/Zj5Zca7atjWldA==
hello

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-358742-1-1.html 上篇帖子: php显示ip地址的类 下篇帖子: php 获取 exec 的输出结果
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表