要在Flex中实现AES加密,可以通过as3crypto实现。但是as3crypto本身的用法比较复杂,一般是封装一下再调用。

下面是9RIA上的一篇文章给出的一个实现,使用中稍感不方便(见注释):

   1: package {
   2: import com.hurlant.crypto.Crypto;
   3: import com.hurlant.crypto.prng.Random;
   4: import com.hurlant.crypto.symmetric.ICipher;
   5: import com.hurlant.crypto.symmetric.IPad;
   6: import com.hurlant.crypto.symmetric.IVMode;
   7: import com.hurlant.crypto.symmetric.PKCS5;
   8: import com.hurlant.util.Base64;
   9: import com.hurlant.util.Hex;
  10:  
  11: import flash.utils.ByteArray;
  12:  
  13: /**
  14: * AES 算法的加密解密工具类。
  15: *
  16: * @author Fuchun
  17: * @langversion 3.0
  18: * @playerversion Flash 11.1
  19: * @productversion 1.0
  20: */
  21: public class AES {
  22:  
  23: /**
  24: * 默认的算法与模式名称。
  25: */
  26: public static const DEFAULT_CIPHER_NAME:String = "aes-128-cbc";
  27:  
  28: /**
  29: * 默认的填充模式。<code>pkcs5</code>
  30: */
  31: public static const DEFAULT_PADNAME:String = "pkcs5";
  32:  
  33: /**
  34: * 无填充。
  35: */
  36: public static const NULL_PADDING:String = "null";
  37:  
  38: private static const RAND:Random = new Random();
  39:  
  40: private var _name:String;
  41: // 密钥
  42: private var _key:ByteArray;
  43: // 向量
  44: private var _iv:ByteArray;
  45: // 填充模式
  46: private var _padName:String;
  47: private var _enc:ICipher;
  48: private var _dec:ICipher;
  49:  
  50: public function AES(key:ByteArray, iv:ByteArray = null, name:String = DEFAULT_CIPHER_NAME, padName:String = DEFAULT_PADNAME) {
  51: _name = name;
  52: _key = key;
  53: _iv = iv;
  54: _padName = padName;
  55: init();
  56: }
  57:  
  58: private function init():void {
  59:   var _pad:IPad = Crypto.getPad(_padName);
  60:   _enc = Crypto.getCipher(_name, _key, _pad);
  61:   _dec = Crypto.getCipher(_name, _key, _pad);
  62:   if (iv) {
  63:     if (_enc is IVMode) {
  64:       var encIvm:IVMode = _enc as IVMode;
  65:       encIvm.IV = iv;
  66:     }
  67:     if (_dec is IVMode) {
  68:       var decIvm:IVMode = _dec as IVMode;
  69:       decIvm.IV = iv;
  70:     }
  71:   }
  72: }
  73:  
  74: public static function generateKey(name:String):ByteArray {
  75:   var keyLength:uint = Crypto.getKeySize(name);
  76:   var key:ByteArray = new ByteArray();
  77:   RAND.nextBytes(key, keyLength);
  78:   return key;
  79: }
  80:  
  81: public static function generateIV(name:String, key:ByteArray):ByteArray {
  82:   var cipher:ICipher = Crypto.getCipher(name, key);
  83:   var iv:ByteArray = new ByteArray();
  84:   RAND.nextBytes(iv, cipher.getBlockSize());
  85:   return iv;
  86: }
  87:  
  88: public function encrypt(input:ByteArray):ByteArray {
  89:   var src:ByteArray = new ByteArray();
  90:   var result:ByteArray = new ByteArray();
  91:   src.writeBytes(input, 0, input.length);
  92:  
  93:   _enc.encrypt(input);
  94:   result.writeBytes(input, 0, input.length);
  95:   input.length = 0;
  96:   input.writeBytes(src, 0, src.length);
  97:  
  98:   src.clear();
  99:   return result;
 100: }
 101:  
 102: public function decrypt(input:ByteArray):ByteArray {
 103:   var src:ByteArray = new ByteArray();
 104:   var result:ByteArray = new ByteArray();
 105:   src.writeBytes(input, 0, input.length);
 106:  
 107:   _dec.decrypt(input);
 108:   result.writeBytes(input, 0, input.length);
 109:   input.length = 0;
 110:   input.writeBytes(src, 0, src.length);
 111:  
 112:   src.clear();
 113:   return result;
 114: }
 115:  
 116: public function encryptString(input:String):ByteArray {
 117:   if (!input || !input.length) {
 118:     return null;
 119:   }
 120:   var inputBytes:ByteArray = new ByteArray();
 121:   inputBytes.writeUTFBytes(input);
 122:   return encrypt(inputBytes);
 123: }
 124:  
 125: //无配对的解密方法,加密后的结果无法直接用decryptString2Hex解密
 126: public function encryptString2Hex(input:String):String {
 127:   var result:ByteArray = encryptString(input);
 128:   return Hex.fromArray(result);
 129: }
 130:  
 131: //无配对的解密方法,加密后的结果无法直接用decryptString2Hex解密
 132: public function encryptString2Base64(input:String):String {
 133:   var result:ByteArray = encryptString(input);
 134:   return Base64.encodeByteArray(result);
 135: }
 136:  
 137: //代码中我们一般习惯直接加密字符串,加密后直接得到密文字符串,这里没有提供这个方法
 138:  
 139: public function decryptString(input:String):ByteArray {
 140:   if (!input || !input.length) {
 141:     return null;
 142:   }
 143:   var inputBytes:ByteArray = new ByteArray();
 144:   inputBytes.writeUTFBytes(input);
 145:   return decrypt(inputBytes);
 146: }
 147:  
 148: public function decryptString2Hex(input:String):String {
 149:   var result:ByteArray = decryptString(input);
 150:   return Hex.fromArray(result);
 151: }
 152:  
 153: public function decryptString2Base64(input:String):String {
 154:   var result:ByteArray = decryptString(input);
 155:   return Base64.encodeByteArray(result);
 156: }
 157:  
 158: public function set iv(value:ByteArray):void {
 159:   _iv = value;
 160: }
 161: public function get iv():ByteArray {
 162:   return _iv;
 163: }
 164: }
 165: }

下面是我修改后的代码:

   1: package utility
   2: {
   3:     import com.hurlant.crypto.Crypto;
   4:     import com.hurlant.crypto.prng.Random;
   5:     import com.hurlant.crypto.symmetric.ICipher;
   6:     import com.hurlant.crypto.symmetric.IPad;
   7:     import com.hurlant.crypto.symmetric.IVMode;
   8:     import com.hurlant.crypto.symmetric.PKCS5;
   9:     import com.hurlant.util.Base64;
  10:     import com.hurlant.util.Hex;
  11:     
  12:     import flash.utils.ByteArray;
  13:     
  14:     /**
  15:      * AES 算法的加密解密工具类。
  16:      *
  17:      * @author Fuchun,modified by caichengyang
  18:      * @langversion 3.0
  19:      * @playerversion Flash 11.1
  20:      * @productversion 1.0
  21:      */
  22:     public class AES {
  23:         
  24:         /**
  25:          * 默认的算法与模式名称。
  26:          */
  27:         public static const DEFAULT_CIPHER_NAME:String = "aes-128-cbc";
  28:         
  29:         /**
  30:          * 默认的填充模式。<code>pkcs5</code>
  31:          */
  32:         public static const DEFAULT_PADNAME:String = "pkcs5";
  33:         
  34:         /**
  35:          * 无填充。
  36:          */
  37:         public static const NULL_PADDING:String = "null";
  38:         
  39:         private static const RAND:Random = new Random();
  40:         
  41:         private var _name:String;
  42:         // 密钥
  43:         private var _key:ByteArray;
  44:         // 向量
  45:         private var _iv:ByteArray;
  46:         // 填充模式
  47:         private var _padName:String;
  48:         private var _enc:ICipher;
  49:         private var _dec:ICipher;
  50:         
  51:         public function AES(key:ByteArray, iv:ByteArray = null, 
  52:                             name:String = DEFAULT_CIPHER_NAME, 
  53:                             padName:String = DEFAULT_PADNAME) {
  54:             _name = name;
  55:             _key = key;
  56:             _iv = iv;
  57:             _padName = padName;
  58:             init();
  59:         }
  60:         
  61:         private function init():void {
  62:             var _pad:IPad = Crypto.getPad(_padName);
  63:             _enc = Crypto.getCipher(_name, _key, _pad);
  64:             _dec = Crypto.getCipher(_name, _key, _pad);
  65:             if (iv) {
  66:                 if (_enc is IVMode) {
  67:                     var encIvm:IVMode = _enc as IVMode;
  68:                     encIvm.IV = iv;
  69:                 }
  70:                 if (_dec is IVMode) {
  71:                     var decIvm:IVMode = _dec as IVMode;
  72:                     decIvm.IV = iv;
  73:                 }
  74:             }
  75:         }
  76:         
  77:         public static function generateKey(name:String):ByteArray {
  78:             var keyLength:uint = Crypto.getKeySize(name);
  79:             var key:ByteArray = new ByteArray();
  80:             RAND.nextBytes(key, keyLength);
  81:             return key;
  82:         }
  83:         
  84:         public static function generateIV(name:String, key:ByteArray):ByteArray {
  85:             var cipher:ICipher = Crypto.getCipher(name, key);
  86:             var iv:ByteArray = new ByteArray();
  87:             RAND.nextBytes(iv, cipher.getBlockSize());
  88:             return iv;
  89:         }
  90:         
  91:         public function set iv(value:ByteArray):void {
  92:             _iv = value;
  93:         }
  94:         
  95:         public function get iv():ByteArray {
  96:             return _iv;
  97:         }
  98:         
  99:         
 100:         // base functions
 101:         public function encrypt(input:ByteArray):ByteArray {
 102:             var src:ByteArray = new ByteArray();
 103:             var result:ByteArray = new ByteArray();
 104:             src.writeBytes(input, 0, input.length);
 105:             
 106:             _enc.encrypt(input);
 107:             result.writeBytes(input, 0, input.length);
 108:             input.length = 0;
 109:             input.writeBytes(src, 0, src.length);
 110:             
 111:             src.clear();
 112:             return result;
 113:         }
 114:         
 115:         public function decrypt(input:ByteArray):ByteArray {
 116:             var src:ByteArray = new ByteArray();
 117:             var result:ByteArray = new ByteArray();
 118:             src.writeBytes(input, 0, input.length);
 119:             
 120:             _dec.decrypt(input);
 121:             result.writeBytes(input, 0, input.length);
 122:             input.length = 0;
 123:             input.writeBytes(src, 0, src.length);
 124:             
 125:             src.clear();
 126:             return result;
 127:         }
 128:         
 129:         
 130:         // encrypt string
 131:         public function encryptString(input:String):ByteArray {
 132:             if (!input || !input.length) {
 133:                 return null;
 134:             }
 135:             var inputBytes:ByteArray = new ByteArray();
 136:             inputBytes.writeUTFBytes(input);
 137:             return encrypt(inputBytes);
 138:         }
 139:         
 140:         public function encryptString2Hex(input:String):String {
 141:             var result:ByteArray = encryptString(input);
 142:             return Hex.fromArray(result);
 143:         }
 144:         
 145:         public function encryptString2Base64(input:String):String {
 146:             var result:ByteArray = encryptString(input);
 147:             return Base64.encodeByteArray(result);
 148:         }
 149:         
 150:         
 151:         // decrypt string
 152:         public function decryptString(input:ByteArray):String {
 153:             var decryptBytes:ByteArray = decrypt(input);
 154:             decryptBytes.position = 0;
 155:             var result:String = decryptBytes.readUTFBytes(decryptBytes.length);
 156:             return result;
 157:         }
 158:         
 159:         public function decryptStringFromHex(input:String):String {
 160:             var inputBytes:ByteArray = Hex.toArray(input);
 161:             var result:String = decryptString(inputBytes);
 162:             return result;
 163:         }
 164:         
 165:         public function decryptStringFromBase64(input:String):String {
 166:             var inputBytes:ByteArray = Base64.decodeToByteArray(input);
 167:             var result:String = decryptString(inputBytes);
 168:             return result;
 169:         }
 170:         
 171:         
 172:     }
 173: }

用法如下:

   1: protected function btnEncrypt_clickHandler(event:MouseEvent):void
   2:             {
   3:                 
   4:                 var key : ByteArray = Hex.toArray("f056180ec970b169980f108c13305642"); //AES.generateKey(AES.DEFAULT_CIPHER_NAME);
   5:                 var iv : ByteArray = Hex.toArray("912467427aa54cccf443d2ae206a63ce"); //AES.generateIV(AES.DEFAULT_CIPHER_NAME, key);
   6:                 
   7:                 lblText.text = lblText.text + "key:" + Hex.fromArray(key) + "\r\n";
   8:                 lblText.text = lblText.text + "iv:" + Hex.fromArray(iv) + "\r\n";
   9:                 
  10:                 var aes : AES = new AES(key, iv, "aes-128-cbc", "null");
  11:                 
  12:                 var plainText:String = "caichengyang";
  13:                 
  14:                 var s1:String = aes.encryptString2Base64(plainText);
  15:                 
  16:                 var s2:String = aes.decryptStringFromBase64(s1);
  17:                 
  18:                 lblText.text = lblText.text + "加密后:" + s1 + "\r\n" + "解密后:" + s2 + "\r\n\r\n";
  19:             }

运行效果如下:

参考:

  1. http://bbs.9ria.com/forum.php?mod=viewthread&tid=160723
  2. http://code.google.com/p/as3crypto/

转载于:https://www.cnblogs.com/EthanCai/p/3145222.html

使用as3crypto在Flex中实现AES加密相关推荐

  1. 探讨.NET Core中实现AES加密和解密以及.NET Core为我们提供了什么方便!

    前言 对于数据加密和解密每次我都是从网上拷贝一份,无需有太多了解,由于在.net core中对加密和解密目前全部是统一了接口,只是做具体的实现,由于遇到过问题,所以将打算基本了解下其原理,知其然足矣, ...

  2. 解密HLS中的AES加密

    解密HLS中的AES加密 主题 加密解密 如果m3u8文件中包含#EXT-X-KEY字段,那么可以断定这个HLS中的ts文件是被加密的,如: #EXTM3U#EXT-X-VERSION:3#EXT-X ...

  3. javascript 解密_Javascript中的AES加密和Java中的解密

    javascript 解密 AES代表高级加密系统,它是一种对称加密算法,很多时候我们需要在客户端加密一些纯文本,例如密码,然后将其发送到服务器,然后由服务器解密以进行进一步处理.AES加密和解密更加 ...

  4. Java中的AES加密和解密(CBC模式)

    通过有线方式传输诸如纯文本密码之类的机密数据总是容易受到安全性的影响,始终建议对此类信息进行加密并使用SSL传输这些机密数据.Java为此提供了多种加密算法.在本文中,我们将讨论Java中具有CBC模 ...

  5. Javascript中的AES加密和Java中的解密

    AES代表高级加密系统,它是一种对称加密算法,很多时候我们需要在客户端加密一些纯文本(例如密码)并将其发送到服务器,然后由服务器解密以进行进一步处理.AES加密和解密更加容易在相同的平台(例如Andr ...

  6. nodejs与javascript中的aes加密

    简介 1.aes加密简单来说,在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用.高级加密标准已然成为对称密钥加 ...

  7. vue中使用AES加密与AES解密

    先安装 npm install crypto-js --save-dev 在项目中新建一个utils.js文件 我建在 src/assets/js/utils.js utils.js文件中的内容 im ...

  8. Android中的AES加密-下

    本文为笔记,记录,写记录后为了方便查阅也为了能更好的记住 参考 什么是AES算法? 前言 本章主要是针对AES加密的原理过程进行梳理.不在于细节,了解各个参数和类的功能来帮助我们再加密是更好的选择如何 ...

  9. Python中的AES加密

    文章目录 AES 加密 一.前言 1. 简介 2. 加密模式 3. 环境配置 二.算法实现 AES 加密 一.前言 1. 简介 AES,高级加密标准(Advanced Encryption Stand ...

最新文章

  1. ECLIPSE 插件使用LINKS目录的用法
  2. 题目1195:最长最短文本
  3. 高 NPS 背后的专业服务体系是如何炼成的?
  4. HDU - 2825 Wireless Password(AC自动机+状压dp)
  5. asp.net 调用本地php,.NET_Asp.net获取服务器指定文件夹目录文件并提供下载的方法,本文实例讲述了Asp.net获取服务 - phpStudy...
  6. 摈弃 Windows 低效率的工作方式,发掘 Linux 身上的 UNIX 气质
  7. Learning Multiview 3D point Cloud Registration论文阅读笔记
  8. pandas.DataFrame的pivot()和unstack()实现行转列
  9. mysql2014安装文档_hive安装文档
  10. 简单Android app开发_什么方法开发APP最简单?试试0代码开发平台
  11. 微信小程序调用app.js里的函数
  12. 【Web笔记】Html学习手册
  13. python模块以及导入出现ImportError: No module named 'xxx'问题
  14. Matlab水果识别——基于形态学处理的水果识别
  15. 浏览器野史 UserAgent列传(上)
  16. 华为p40pro,小米10pro,适合自己的才是最好的
  17. Excel学习日记:L23-如何计算成绩排名
  18. 笔记本计算机声音小,笔记本声音太小怎么加大 笔记本声音太小增大方法【详细介绍】...
  19. 学PHP时,端口被占用,怎么找端口的占用情况。
  20. python编辑程序模型_用Python的SimPy库简化复杂的编程模型的介绍

热门文章

  1. bash 脚本_实用的 bash 自定义脚本,快速提效工作流程
  2. JavaScript函数节流和函数防抖之间的区别
  3. java图片转换pdf_Java实现图片转换PDF文件的示例代码
  4. html 自定义标签 seo,wordpress深层seo优化:自定义栏目和tag标签页面title标题
  5. 文件不混淆_Python代码保护 | pyc 混淆从入门到工具实现
  6. 数组占位符_Java基础 方法和数组
  7. ajax上传多行数据及数组循环添加对象
  8. shell取得文件行数6法
  9. 澎思科技获洪泰基金千万级天使轮融资,深耕AI+安防行业
  10. 微软又开源了一个机器学习框架,这次是核心产品的机器学习引擎infer.NET