flash + php对称密钥加密的交互
这几天研究了下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;//加密类
- /**
- * 构造函数
- * @param base64keyString 密钥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编码字符串
- * @param plainSrc 明文
- * @return 密文base64编码
- */
- public function encrypt(plainSrc:String):String
- {
- var src:ByteArray = Hex.toArray(Hex.fromString(plainSrc));
- _mode.encrypt(src);
- return Base64.encodeByteArray(src);
- }
- /**
- * 将base64编码字符串(密文)解密成 明文
- * @param base64Src 密文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 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;//加密类
/**
* 构造函数
* @param base64keyString 密钥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编码字符串
* @param plainSrc 明文
* @return 密文base64编码
*/
public function encrypt(plainSrc:String):String
{
var src:ByteArray = Hex.toArray(Hex.fromString(plainSrc));
_mode.encrypt(src);
return Base64.encodeByteArray(src);
} /**
* 将base64编码字符串(密文)解密成 明文
* @param base64Src 密文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")));
- }
- }
- }
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;
- publicfunction __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);
- }
- publicfunction __destruct()
- {
- mcrypt_module_close($this->td);
- }
- /**
- * 将明文加密为密文base64编码字符串
- * @param plainSrc 明文
- * @return 密文base64编码
- */
- publicfunction encrypt($plainSrc)
- {
- $td = $this->td;
- //初始化加密
- mcrypt_generic_init($td, $this->key, $this->iv);
- //加密
- $encrypted = mcrypt_generic($td,$this->PaddingPKCS7($plainSrc));
- //终止加密,主要是一些内存清理
- mcrypt_generic_deinit($td);
- //返回
- returnbase64_encode($encrypted);
- }
- /**
- * 将base64编码字符串(密文)解密成 明文
- * @param base64Src 密文base64编码字符串
- * @return 明文
- */
- publicfunction 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);
- }
- //填充
- privatefunction PaddingPKCS7 ($data)
- {
- $block_size = $this->blocksize;
- $padding_char = $block_size - (strlen($data) % $block_size);
- $data .= str_repeat(chr($padding_char), $padding_char);
- return$data;
- }
- privatefunction 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;
- }
- returnsubstr($text, 0, - 1 * $pad);
- }
- }
- $aes = new phpAes("MK2X82eL6jkKbzvlJU1ZMR6rcKO+SBhmbPOmFD/2Mxw=");
- $enc = $aes->encrypt("hello");
- echo$enc."<br>";
- echo$aes->decrypt($enc);
- ?>
<?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编码字符串
* @param plainSrc 明文
* @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编码字符串(密文)解密成 明文
* @param base64Src 密文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
flash + php对称密钥加密的交互的更多相关文章
- 十二张图:从0开始理解对称/非对称加密、CA认证、以及K8S各组件颁发证书原由
目录 一.对称加密 二.对称加密-不安全 三.非对称加密 四.非对称加密-不安全 五.对称加密和非对称加密结合 六.对称加密和非对称加密结合-不安全 七.Https的做法-引入CA机构 八.乘胜追击理 ...
- Android 中 非对称(RSA)加密和对称(AES)加密
在非对称加密中使用的主要算法有:RSA.Elgamal.背包算法.Rabin.D-H.ECC(椭圆曲线加密算法)等. 优点: 非对称加密与对称加密相比,其安全性更好:对称加密的通信双方使用相同的秘钥, ...
- DES,3DES,AES这三种对称密钥的区别与联系
DES:Data Encryption Standard(数据加密标准,又美国国密局,选中的IBM的方案,密钥长度为56,标准提出是要使用64位长的密钥,但是实际中DES算法只用了64位中的56位密钥 ...
- C# Java间进行RSA加密解密交互(二)
原文:C# Java间进行RSA加密解密交互(二) 接着前面一篇文章C# Java间进行RSA加密解密交互,继续探讨这个问题. 在前面,虽然已经实现了C# Java间进行RSA加密解密交互,但是还是与 ...
- C# Java间进行RSA加密解密交互(三)
原文:C# Java间进行RSA加密解密交互(三) 接着前面一篇C# Java间进行RSA加密解密交互(二)说吧,在上篇中为了实现 /** * RSA加密 * @param text--待加密的明文 ...
- Flash型单片机的加密与解密
厂商利用单片机进行产品开发时,都会关心其代码和数据的保密性.考虑到用户在编写和调试代码时所付出的时间和精力,代码的成本是不言而喻的. 早期的单片机,代码是交给芯片制造商制成掩膜ROM.有两种加密 ...
- 关于ECDSA/ECC(密钥加密传输)和ECDSA/ECDH(密钥磋商)
关于ECDSA/ECC(密钥加密传输)和ECDSA/ECDH(密钥磋商) 来源: https://blog.csdn.net/xueyepiaoling/article/details/6243337 ...
- MD5 不可逆加密,Des对称可逆加密 ,RSA非对称可逆加密 ,数字证书 SSL
:MD5 不可逆加密2:Des对称可逆加密3:RSA非对称可逆加密4:数字证书 SSL Anker_张(博客园)http://www.cnblogs.com/AnkerZhang/ 1:MD5 不可逆 ...
- 常见的哈希Hash算法 & MD5 & 对称非对称加密 & 海明码
参考 Link 另外,这篇文章也提到了利用Hash碰撞而产生DOS攻击的案例: http://www.cnblogs.com/charlesblc/p/5990475.html DJB的算法实现核心是 ...
随机推荐
- Python中的矩阵、多维数组:Numpy
Numpy 是Python中科学计算的核心库.它提供一个高性能多维数据对象,以及操作这个对象的工具.部分功能如下: ndarray, 具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组. 用于对 ...
- [Xcode 实际操作]三、视图控制器-(4)使用UINavigationController导航栏和工具栏
目录:[Swift]Xcode实际操作 本文将演示如何显示和隐藏导航视图的导航栏和工具栏 打开第一个视图控制器 import UIKit class FirstSubViewController: U ...
- git分支主干
~/Desktop/work/movies/movie(apps) $ git status //先查看是否有需要提交的东西# On branch appsnothing to commit (wo ...
- CPU使用情况检测
改编自:https://blog.csdn.net/Yan_Chou/article/details/80456995 检测命令整理: dd iotop df top psiostatvmstatne ...
- 主键约束 primary key
主键的作用: 可以唯一标识 一条数据,每张表里面只能有一个主键,.主键特性: 非空且唯一.当表里没有主键的时,第一个出现的非空且为唯一的列,被当成主键. 例子:create table tb3( ...
- HIVE获取表的大小和修改日期
### 获取表的大小 hdfs dfs -du /user/hive/warehouse/database_name.db/ > 360_du ### 获取表的修改日期 hdfs dfs -ls ...
- mycat1.6.5分片(字符串拆分hash)
https://blog.csdn.net/webnum/article/details/78313525 分片规则:字符串拆分hash 一.conf/schema.xml文件 <?xm ...
- java——模拟新浪微博用户注册
1.创建用户类,重写HashCode()和equals()方法: import java.util.*; public class User{ private String name; private ...
- 转 rman-08120 以及查询隐含参数
rman-08120 We need RMAN to automatically purge archivelogs from the FRA once they are applied to the ...
- html 页面跳转方式
网页的跳转在很多时候都非常的有用,下面的是两个简单的例子.仅供参考. 一.用<meta>里直接写刷新语句:5秒后跳转到百度 <html> <head> <me ...