这几天研究了下php和flash中的对称密钥加密的交互问题,经过研究以后决定,在项目中使用aes加密。问题也就来了,在flash中的加密数据如何与php的amf进行数据交互,最终决定使用base64编码。
一、flash中的aes加密 这里使用的是官方的库as3crypto:一个as3的关于加解密的开源项目 http://code.google.com/p/as3crypto/
加解密类如下:

  1. package org.randy.crypto
  2. {
  3. import com.hurlant.crypto.symmetric.AESKey;
  4. import com.hurlant.crypto.symmetric.ECBMode;
  5. import com.hurlant.crypto.symmetric.ICipher;
  6. import com.hurlant.crypto.symmetric.IPad;
  7. import com.hurlant.crypto.symmetric.PKCS5;
  8. import com.hurlant.util.Base64;
  9. import com.hurlant.util.Hex;
  10. import flash.utils.ByteArray;
  11. /**
  12. * ...
  13. * @author Randy
  14. */
  15. public class Aes
  16. {
  17. private var _pad:IPad;//填充方式
  18. private var _mode:ICipher;//加密类
  19. /**
  20. * 构造函数
  21. * @param   base64keyString   密钥base64编码字符串
  22. */
  23. public function Aes(base64keyString:String)
  24. {
  25. _pad = new PKCS5(); //为了与java保持一致,所以采用PKCS5填充
  26. var key:ByteArray = Base64.decodeToByteArray(base64keyString);
  27. _mode = new ECBMode(new AESKey(key), _pad);
  28. _pad.setBlockSize(_mode.getBlockSize());
  29. }
  30. /**
  31. * 将明文加密为密文base64编码字符串
  32. * @param   plainSrc         明文
  33. * @return  密文base64编码
  34. */
  35. public function encrypt(plainSrc:String):String
  36. {
  37. var src:ByteArray = Hex.toArray(Hex.fromString(plainSrc));
  38. _mode.encrypt(src);
  39. return Base64.encodeByteArray(src);
  40. }
  41. /**
  42. * 将base64编码字符串(密文)解密成 明文
  43. * @param   base64Src  密文base64编码字符串
  44. * @return  明文
  45. */
  46. public function decrypt(base64Src:String):String
  47. {
  48. var src:ByteArray = Base64.decodeToByteArray(base64Src);
  49. _mode.decrypt(src);
  50. return Base64.decode(Base64.encodeByteArray(src));
  51. }
  52. /**
  53. * 释放内存
  54. */
  55. public function dispose():void
  56. {
  57. _mode.dispose();
  58. _mode = null;
  59. _pad = null;
  60. }
  61. }
  62. }
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;
}
} }

测试类:

  1. package
  2. {
  3. import com.hurlant.util.Base64;
  4. import flash.display.Sprite;
  5. import org.randy.crypto.Aes;
  6. /**
  7. * ...
  8. * @author Randy
  9. */
  10. public class AesTest extends Sprite
  11. {
  12. private var _aes:Aes;
  13. public function AesTest()
  14. {
  15. _aes = new Aes("MK2X82eL6jkKbzvlJU1ZMR6rcKO+SBhmbPOmFD/2Mxw=");
  16. trace(_aes.encrypt("hello"));
  17. trace(_aes.decrypt(_aes.encrypt("hello")));
  18. }
  19. }
  20. }
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=......... 直接忽略掉

  1. <?php
  2. class phpAes
  3. {
  4. private$td;//加密模块
  5. private$key;//密钥
  6. private$blocksize;
  7. publicfunction __construct($base64key)
  8. {
  9. //密钥
  10. $this->key = base64_decode($base64key);
  11. //打开模块
  12. $this->td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', "ecb", '');
  13. $this->blocksize = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, 'ecb');
  14. $this->iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($this->td), MCRYPT_RAND);
  15. }
  16. publicfunction __destruct()
  17. {
  18. mcrypt_module_close($this->td);
  19. }
  20. /**
  21. * 将明文加密为密文base64编码字符串
  22. * @param   plainSrc         明文
  23. * @return  密文base64编码
  24. */
  25. publicfunction encrypt($plainSrc)
  26. {
  27. $td = $this->td;
  28. //初始化加密
  29. mcrypt_generic_init($td, $this->key, $this->iv);
  30. //加密
  31. $encrypted = mcrypt_generic($td,$this->PaddingPKCS7($plainSrc));
  32. //终止加密,主要是一些内存清理
  33. mcrypt_generic_deinit($td);
  34. //返回
  35. returnbase64_encode($encrypted);
  36. }
  37. /**
  38. * 将base64编码字符串(密文)解密成 明文
  39. * @param   base64Src  密文base64编码字符串
  40. * @return  明文
  41. */
  42. publicfunction decrypt($base64Src)
  43. {
  44. $src = base64_decode($base64Src);
  45. $td = $this->td;
  46. //初始化解密
  47. mcrypt_generic_init($td, $this->key, $this->iv);
  48. //解密
  49. $decrypted = mdecrypt_generic($td,$src);
  50. //终止解密,主要是一些内存清理
  51. mcrypt_generic_deinit($td);
  52. //返回
  53. return$this->UnPaddingPKCS7($decrypted);
  54. }
  55. //填充
  56. privatefunction PaddingPKCS7 ($data)
  57. {
  58. $block_size =  $this->blocksize;
  59. $padding_char = $block_size - (strlen($data) % $block_size);
  60. $data .= str_repeat(chr($padding_char), $padding_char);
  61. return$data;
  62. }
  63. privatefunction UnPaddingPKCS7($text)
  64. {
  65. $pad = ord($text{strlen($text) - 1});
  66. if ($pad > strlen($text)) {
  67. return false;
  68. }
  69. if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) {
  70. return false;
  71. }
  72. returnsubstr($text, 0, - 1 * $pad);
  73. }
  74. }
  75. $aes = new phpAes("MK2X82eL6jkKbzvlJU1ZMR6rcKO+SBhmbPOmFD/2Mxw=");
  76. $enc = $aes->encrypt("hello");
  77. echo$enc."<br>";
  78. echo$aes->decrypt($enc);
  79. ?>
<?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对称密钥加密的交互的更多相关文章

  1. 十二张图:从0开始理解对称/非对称加密、CA认证、以及K8S各组件颁发证书原由

    目录 一.对称加密 二.对称加密-不安全 三.非对称加密 四.非对称加密-不安全 五.对称加密和非对称加密结合 六.对称加密和非对称加密结合-不安全 七.Https的做法-引入CA机构 八.乘胜追击理 ...

  2. Android 中 非对称(RSA)加密和对称(AES)加密

    在非对称加密中使用的主要算法有:RSA.Elgamal.背包算法.Rabin.D-H.ECC(椭圆曲线加密算法)等. 优点: 非对称加密与对称加密相比,其安全性更好:对称加密的通信双方使用相同的秘钥, ...

  3. DES,3DES,AES这三种对称密钥的区别与联系

    DES:Data Encryption Standard(数据加密标准,又美国国密局,选中的IBM的方案,密钥长度为56,标准提出是要使用64位长的密钥,但是实际中DES算法只用了64位中的56位密钥 ...

  4. C# Java间进行RSA加密解密交互(二)

    原文:C# Java间进行RSA加密解密交互(二) 接着前面一篇文章C# Java间进行RSA加密解密交互,继续探讨这个问题. 在前面,虽然已经实现了C# Java间进行RSA加密解密交互,但是还是与 ...

  5. C# Java间进行RSA加密解密交互(三)

    原文:C# Java间进行RSA加密解密交互(三) 接着前面一篇C# Java间进行RSA加密解密交互(二)说吧,在上篇中为了实现 /** * RSA加密 * @param text--待加密的明文 ...

  6. Flash型单片机的加密与解密

    厂商利用单片机进行产品开发时,都会关心其代码和数据的保密性.考虑到用户在编写和调试代码时所付出的时间和精力,代码的成本是不言而喻的.    早期的单片机,代码是交给芯片制造商制成掩膜ROM.有两种加密 ...

  7. 关于ECDSA/ECC(密钥加密传输)和ECDSA/ECDH(密钥磋商)

    关于ECDSA/ECC(密钥加密传输)和ECDSA/ECDH(密钥磋商) 来源: https://blog.csdn.net/xueyepiaoling/article/details/6243337 ...

  8. MD5 不可逆加密,Des对称可逆加密 ,RSA非对称可逆加密 ,数字证书 SSL

    :MD5 不可逆加密2:Des对称可逆加密3:RSA非对称可逆加密4:数字证书 SSL Anker_张(博客园)http://www.cnblogs.com/AnkerZhang/ 1:MD5 不可逆 ...

  9. 常见的哈希Hash算法 & MD5 & 对称非对称加密 & 海明码

    参考 Link 另外,这篇文章也提到了利用Hash碰撞而产生DOS攻击的案例: http://www.cnblogs.com/charlesblc/p/5990475.html DJB的算法实现核心是 ...

随机推荐

  1. .frm和.ibd恢复数据

    昨日晚上开发告诉我不小心truncate两个表的数据,要求还原.结果在阿里云上找到了备份内容,结果是物理备份文件.frm..ibd.心中一万个草泥马啊..没办法,开始还原吧. 1.查看测试机Mysql ...

  2. Docker 容器的数据卷

    数据卷的特点: 1. 数据卷在容器启动时初始化,如果容器使用的镜像在挂载点包含了数据,这些数据会拷贝到新初始化的数据卷中 2. 数据卷可以在容器之间共享和重用 3. 可以对数据卷里的内容直接进行修改 ...

  3. 关于SqlDataReader使用的一点疑惑

    C#中的SqlDataReader类(System.Data.SqlClient)是用来在保持打开数据库连接的状态下取数据用的 用法如下图: “保持与数据库的连接”这个特性也是SqlDataReade ...

  4. 关于Android模块化我有一些话不知当讲不当讲

    关于Android模块化我有一些话不知当讲不当讲 最近公司一个项目使用了模块化设计,本人参与其中的一个小模块开发,但是整体的设计并不是我架构设计的,开发半年有余,在此记录下来我的想法. 关于Andro ...

  5. 20165224 陆艺杰 Exp 8 Web基础

    .基础问题回答 (1)什么是表单 html的一个控件 表单在网页中主要负责数据采集功能 (2)浏览器可以解析运行什么语言 html xml jsp php python 等 (3)WebServer支 ...

  6. AngularJs1.X学习--路由

    [三种使用说明:] $stateProvider.state('station.printQRCode', { //params: { 'parentOfficeId': null }, //一次性参 ...

  7. matplotlib 知识点11:绘制饼图(pie 函数精讲)

    饼图英文学名为Sector Graph,又名Pie Graph.常用于统计学模块. 画饼图用到的方法为:matplotlib.pyplot.pie( ) #!/usr/bin/env python # ...

  8. Maven的作用到底是什么

    1 . 帮你下载jar包 maven项目会有一个 pom.xml文件, 在这个文件里面,只要你添加相应配置,他就会自动帮你下载相应jar包,不用你铺天盖地的到处搜索你需要的jar包了 下面是示范配置文 ...

  9. 非局部均值去噪(NL-means)

    非局部均值(NL-means)是近年来提出的一项新型的去噪技术.该方法充分利用了图像中的冗余信息,在去噪的同时能最大程度地保持图像的细节特征.基本思想是:当前像素的估计值由图像中与它具有相似邻域结构的 ...

  10. 记一次内存溢出java.lang.OutOfMemoryError: unable to create new native thread

    一.问题: 春节将至,系统访问量进入高峰期.随之系统出现了异常:java.lang.OutOfMemoryError: unable to create new native thread.在解决这个 ...