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

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

  1. 1: package {

  1. 2: import com.hurlant.crypto.Crypto;

  1. 3: import com.hurlant.crypto.prng.Random;

  1. 4: import com.hurlant.crypto.symmetric.ICipher;

  1. 5: import com.hurlant.crypto.symmetric.IPad;

  1. 6: import com.hurlant.crypto.symmetric.IVMode;

  1. 7: import com.hurlant.crypto.symmetric.PKCS5;

  1. 8: import com.hurlant.util.Base64;

  1. 9: import com.hurlant.util.Hex;

  1. 10: 

  1. 11: import flash.utils.ByteArray;

  1. 12: 

  1. 13: /**

  1. 14: * AES 算法的加密解密工具类。

  1. 15: *

  1. 16: * @author Fuchun

  1. 17: * @langversion 3.0

  1. 18: * @playerversion Flash 11.1

  1. 19: * @productversion 1.0

  1. 20: */

  1. 21: public class AES {

  1. 22: 

  1. 23: /**

  1. 24: * 默认的算法与模式名称。

  1. 25: */

  1. 26: public static const DEFAULT_CIPHER_NAME:String = "aes-128-cbc";

  1. 27: 

  1. 28: /**

  1. 29: * 默认的填充模式。<code>pkcs5</code>

  1. 30: */

  1. 31: public static const DEFAULT_PADNAME:String = "pkcs5";

  1. 32: 

  1. 33: /**

  1. 34: * 无填充。

  1. 35: */

  1. 36: public static const NULL_PADDING:String = "null";

  1. 37: 

  1. 38: private static const RAND:Random = new Random();

  1. 39: 

  1. 40: private var _name:String;

  1. 41: // 密钥

  1. 42: private var _key:ByteArray;

  1. 43: // 向量

  1. 44: private var _iv:ByteArray;

  1. 45: // 填充模式

  1. 46: private var _padName:String;

  1. 47: private var _enc:ICipher;

  1. 48: private var _dec:ICipher;

  1. 49: 

  1. 50: public function AES(key:ByteArray, iv:ByteArray = null, name:String = DEFAULT_CIPHER_NAME, padName:String = DEFAULT_PADNAME) {

  1. 51: _name = name;

  1. 52: _key = key;

  1. 53: _iv = iv;

  1. 54: _padName = padName;

  1. 55: init();

  1. 56: }

  1. 57: 

  1. 58: private function init():void {

  1. 59: var _pad:IPad = Crypto.getPad(_padName);

  1. 60: _enc = Crypto.getCipher(_name, _key, _pad);

  1. 61: _dec = Crypto.getCipher(_name, _key, _pad);

  1. 62: if (iv) {

  1. 63: if (_enc is IVMode) {

  1. 64: var encIvm:IVMode = _enc as IVMode;

  1. 65: encIvm.IV = iv;

  1. 66: }

  1. 67: if (_dec is IVMode) {

  1. 68: var decIvm:IVMode = _dec as IVMode;

  1. 69: decIvm.IV = iv;

  1. 70: }

  1. 71: }

  1. 72: }

  1. 73: 

  1. 74: public static function generateKey(name:String):ByteArray {

  1. 75: var keyLength:uint = Crypto.getKeySize(name);

  1. 76: var key:ByteArray = new ByteArray();

  1. 77: RAND.nextBytes(key, keyLength);

  1. 78: return key;

  1. 79: }

  1. 80: 

  1. 81: public static function generateIV(name:String, key:ByteArray):ByteArray {

  1. 82: var cipher:ICipher = Crypto.getCipher(name, key);

  1. 83: var iv:ByteArray = new ByteArray();

  1. 84: RAND.nextBytes(iv, cipher.getBlockSize());

  1. 85: return iv;

  1. 86: }

  1. 87: 

  1. 88: public function encrypt(input:ByteArray):ByteArray {

  1. 89: var src:ByteArray = new ByteArray();

  1. 90: var result:ByteArray = new ByteArray();

  1. 91: src.writeBytes(input, 0, input.length);

  1. 92: 

  1. 93: _enc.encrypt(input);

  1. 94: result.writeBytes(input, 0, input.length);

  1. 95: input.length = 0;

  1. 96: input.writeBytes(src, 0, src.length);

  1. 97: 

  1. 98: src.clear();

  1. 99: return result;

  1. 100: }

  1. 101: 

  1. 102: public function decrypt(input:ByteArray):ByteArray {

  1. 103: var src:ByteArray = new ByteArray();

  1. 104: var result:ByteArray = new ByteArray();

  1. 105: src.writeBytes(input, 0, input.length);

  1. 106: 

  1. 107: _dec.decrypt(input);

  1. 108: result.writeBytes(input, 0, input.length);

  1. 109: input.length = 0;

  1. 110: input.writeBytes(src, 0, src.length);

  1. 111: 

  1. 112: src.clear();

  1. 113: return result;

  1. 114: }

  1. 115: 

  1. 116: public function encryptString(input:String):ByteArray {

  1. 117: if (!input || !input.length) {

  1. 118: return null;

  1. 119: }

  1. 120: var inputBytes:ByteArray = new ByteArray();

  1. 121: inputBytes.writeUTFBytes(input);

  1. 122: return encrypt(inputBytes);

  1. 123: }

  1. 124: 

  1. 125: //无配对的解密方法,加密后的结果无法直接用decryptString2Hex解密

  1. 126: public function encryptString2Hex(input:String):String {

  1. 127: var result:ByteArray = encryptString(input);

  1. 128: return Hex.fromArray(result);

  1. 129: }

  1. 130: 

  1. 131: //无配对的解密方法,加密后的结果无法直接用decryptString2Hex解密

  1. 132: public function encryptString2Base64(input:String):String {

  1. 133: var result:ByteArray = encryptString(input);

  1. 134: return Base64.encodeByteArray(result);

  1. 135: }

  1. 136: 

  1. 137: //代码中我们一般习惯直接加密字符串,加密后直接得到密文字符串,这里没有提供这个方法

  1. 138: 

  1. 139: public function decryptString(input:String):ByteArray {

  1. 140: if (!input || !input.length) {

  1. 141: return null;

  1. 142: }

  1. 143: var inputBytes:ByteArray = new ByteArray();

  1. 144: inputBytes.writeUTFBytes(input);

  1. 145: return decrypt(inputBytes);

  1. 146: }

  1. 147: 

  1. 148: public function decryptString2Hex(input:String):String {

  1. 149: var result:ByteArray = decryptString(input);

  1. 150: return Hex.fromArray(result);

  1. 151: }

  1. 152: 

  1. 153: public function decryptString2Base64(input:String):String {

  1. 154: var result:ByteArray = decryptString(input);

  1. 155: return Base64.encodeByteArray(result);

  1. 156: }

  1. 157: 

  1. 158: public function set iv(value:ByteArray):void {

  1. 159: _iv = value;

  1. 160: }

  1. 161: public function get iv():ByteArray {

  1. 162: return _iv;

  1. 163: }

  1. 164: }

  1. 165: }

下面是我修改后的代码:

  1. 1: package utility

  1. 2: {

  1. 3: import com.hurlant.crypto.Crypto;

  1. 4: import com.hurlant.crypto.prng.Random;

  1. 5: import com.hurlant.crypto.symmetric.ICipher;

  1. 6: import com.hurlant.crypto.symmetric.IPad;

  1. 7: import com.hurlant.crypto.symmetric.IVMode;

  1. 8: import com.hurlant.crypto.symmetric.PKCS5;

  1. 9: import com.hurlant.util.Base64;

  1. 10: import com.hurlant.util.Hex;

  1. 11:

  1. 12: import flash.utils.ByteArray;

  1. 13:

  1. 14: /**

  1. 15: * AES 算法的加密解密工具类。

  1. 16: *

  1. 17: * @author Fuchunmodified by caichengyang

  1. 18: * @langversion 3.0

  1. 19: * @playerversion Flash 11.1

  1. 20: * @productversion 1.0

  1. 21: */

  1. 22: public class AES {

  1. 23:

  1. 24: /**

  1. 25: * 默认的算法与模式名称。

  1. 26: */

  1. 27: public static const DEFAULT_CIPHER_NAME:String = "aes-128-cbc";

  1. 28:

  1. 29: /**

  1. 30: * 默认的填充模式。<code>pkcs5</code>

  1. 31: */

  1. 32: public static const DEFAULT_PADNAME:String = "pkcs5";

  1. 33:

  1. 34: /**

  1. 35: * 无填充。

  1. 36: */

  1. 37: public static const NULL_PADDING:String = "null";

  1. 38:

  1. 39: private static const RAND:Random = new Random();

  1. 40:

  1. 41: private var _name:String;

  1. 42: // 密钥

  1. 43: private var _key:ByteArray;

  1. 44: // 向量

  1. 45: private var _iv:ByteArray;

  1. 46: // 填充模式

  1. 47: private var _padName:String;

  1. 48: private var _enc:ICipher;

  1. 49: private var _dec:ICipher;

  1. 50:

  1. 51: public function AES(key:ByteArray, iv:ByteArray = null,

  1. 52: name:String = DEFAULT_CIPHER_NAME,

  1. 53: padName:String = DEFAULT_PADNAME) {

  1. 54: _name = name;

  1. 55: _key = key;

  1. 56: _iv = iv;

  1. 57: _padName = padName;

  1. 58: init();

  1. 59: }

  1. 60:

  1. 61: private function init():void {

  1. 62: var _pad:IPad = Crypto.getPad(_padName);

  1. 63: _enc = Crypto.getCipher(_name, _key, _pad);

  1. 64: _dec = Crypto.getCipher(_name, _key, _pad);

  1. 65: if (iv) {

  1. 66: if (_enc is IVMode) {

  1. 67: var encIvm:IVMode = _enc as IVMode;

  1. 68: encIvm.IV = iv;

  1. 69: }

  1. 70: if (_dec is IVMode) {

  1. 71: var decIvm:IVMode = _dec as IVMode;

  1. 72: decIvm.IV = iv;

  1. 73: }

  1. 74: }

  1. 75: }

  1. 76:

  1. 77: public static function generateKey(name:String):ByteArray {

  1. 78: var keyLength:uint = Crypto.getKeySize(name);

  1. 79: var key:ByteArray = new ByteArray();

  1. 80: RAND.nextBytes(key, keyLength);

  1. 81: return key;

  1. 82: }

  1. 83:

  1. 84: public static function generateIV(name:String, key:ByteArray):ByteArray {

  1. 85: var cipher:ICipher = Crypto.getCipher(name, key);

  1. 86: var iv:ByteArray = new ByteArray();

  1. 87: RAND.nextBytes(iv, cipher.getBlockSize());

  1. 88: return iv;

  1. 89: }

  1. 90:

  1. 91: public function set iv(value:ByteArray):void {

  1. 92: _iv = value;

  1. 93: }

  1. 94:

  1. 95: public function get iv():ByteArray {

  1. 96: return _iv;

  1. 97: }

  1. 98:

  1. 99:

  1. 100: // base functions

  1. 101: public function encrypt(input:ByteArray):ByteArray {

  1. 102: var src:ByteArray = new ByteArray();

  1. 103: var result:ByteArray = new ByteArray();

  1. 104: src.writeBytes(input, 0, input.length);

  1. 105:

  1. 106: _enc.encrypt(input);

  1. 107: result.writeBytes(input, 0, input.length);

  1. 108: input.length = 0;

  1. 109: input.writeBytes(src, 0, src.length);

  1. 110:

  1. 111: src.clear();

  1. 112: return result;

  1. 113: }

  1. 114:

  1. 115: public function decrypt(input:ByteArray):ByteArray {

  1. 116: var src:ByteArray = new ByteArray();

  1. 117: var result:ByteArray = new ByteArray();

  1. 118: src.writeBytes(input, 0, input.length);

  1. 119:

  1. 120: _dec.decrypt(input);

  1. 121: result.writeBytes(input, 0, input.length);

  1. 122: input.length = 0;

  1. 123: input.writeBytes(src, 0, src.length);

  1. 124:

  1. 125: src.clear();

  1. 126: return result;

  1. 127: }

  1. 128:

  1. 129:

  1. 130: // encrypt string

  1. 131: public function encryptString(input:String):ByteArray {

  1. 132: if (!input || !input.length) {

  1. 133: return null;

  1. 134: }

  1. 135: var inputBytes:ByteArray = new ByteArray();

  1. 136: inputBytes.writeUTFBytes(input);

  1. 137: return encrypt(inputBytes);

  1. 138: }

  1. 139:

  1. 140: public function encryptString2Hex(input:String):String {

  1. 141: var result:ByteArray = encryptString(input);

  1. 142: return Hex.fromArray(result);

  1. 143: }

  1. 144:

  1. 145: public function encryptString2Base64(input:String):String {

  1. 146: var result:ByteArray = encryptString(input);

  1. 147: return Base64.encodeByteArray(result);

  1. 148: }

  1. 149:

  1. 150:

  1. 151: // decrypt string

  1. 152: public function decryptString(input:ByteArray):String {

  1. 153: var decryptBytes:ByteArray = decrypt(input);

  1. 154: decryptBytes.position = 0;

  1. 155: var result:String = decryptBytes.readUTFBytes(decryptBytes.length);

  1. 156: return result;

  1. 157: }

  1. 158:

  1. 159: public function decryptStringFromHex(input:String):String {

  1. 160: var inputBytes:ByteArray = Hex.toArray(input);

  1. 161: var result:String = decryptString(inputBytes);

  1. 162: return result;

  1. 163: }

  1. 164:

  1. 165: public function decryptStringFromBase64(input:String):String {

  1. 166: var inputBytes:ByteArray = Base64.decodeToByteArray(input);

  1. 167: var result:String = decryptString(inputBytes);

  1. 168: return result;

  1. 169: }

  1. 170:

  1. 171:

  1. 172: }

  1. 173: }

用法如下:

  1. 1: protected function btnEncrypt_clickHandler(event:MouseEvent):void

  1. 2: {

  1. 3:

  1. 4: var key : ByteArray = Hex.toArray("f056180ec970b169980f108c13305642"); //AES.generateKey(AES.DEFAULT_CIPHER_NAME);

  1. 5: var iv : ByteArray = Hex.toArray("912467427aa54cccf443d2ae206a63ce"); //AES.generateIV(AES.DEFAULT_CIPHER_NAME, key);

  1. 6:

  1. 7: lblText.text = lblText.text + "key:" + Hex.fromArray(key) + "\r\n";

  1. 8: lblText.text = lblText.text + "iv:" + Hex.fromArray(iv) + "\r\n";

  1. 9:

  1. 10: var aes : AES = new AES(key, iv, "aes-128-cbc", "null");

  1. 11:

  1. 12: var plainText:String = "caichengyang";

  1. 13:

  1. 14: var s1:String = aes.encryptString2Base64(plainText);

  1. 15:

  1. 16: var s2:String = aes.decryptStringFromBase64(s1);

  1. 17:

  1. 18: lblText.text = lblText.text + "加密后:" + s1 + "\r\n" + "解密后:" + s2 + "\r\n\r\n";

  1. 19: }

运行效果如下:

参考:

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

使用as3crypto在Flex中实现AES加密的更多相关文章

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

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

  2. nodejs与javascript中的aes加密

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

  3. Vue项目中使用AES加密

    1.在vue中安装crypto-js        备注:千万不要安装错了,中间是 ‘-’连接,不是‘.’ 2.在项目的工具文件夹中新建 encryption.js,用于定义加密和解密的方法,方便调用 ...

  4. PHP、Java对称加密中的AES加密方法

    PHP AES加密 <?php ini_set('default_charset','utf-8'); class AES{ public $iv = null; public $key = n ...

  5. JAVA中使用AES加密解密

    技术交流群: 233513714 /** * AES加密测试 * * @param str 加密参数 */ public void aesTest(String str) { log.info(&qu ...

  6. OPENSSL安装 以及使用openssl中的AES加密和解密

    OPENSSL安装:(VS) 1:第一步和所有的软件安装一样. 2:将OPENSSL中INLUCDE 和 LIB 分别拷贝到VS中VC的INLUCDE 和LIB目录下(我的机器上的目录是:C:\Pro ...

  7. 在Java中使用AES加密

    本文转载https://blog.csdn.net/z69183787/article/details/82746686

  8. openssl与cryptoAPI交互AES加密解密

    继上次只有CryptoAPI的加密后,这次要实现openssl的了 动机:利用CryptoAPI制作windows的IE,火狐和chrome加密控件后,这次得加上与android的加密信息交互 先前有 ...

  9. 探讨数据进行AES加密和解密以及.NET Core对加密和解密为我们提供了什么?

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

随机推荐

  1. Hive Tunning(二)优化存储

    接着上一章我们讲的hive的连接策略,现在我们讲一下hive的数据存储. 下面是hive支持的数据存储格式,有我们常见的文本,JSON,XML,这里我们主要讲一下ORCFile. Built-in F ...

  2. iOS彩票项目--第四天,新特性界面搭建,UICollectionViewController的初次使用

    一.新特性界面搭建的思路: 在AppDelegate加载主窗体的时候进行判断程序版本号,直接进入程序或者进入新特性展示界面 取出当前的版本号,与旧的版本号相比较(旧的版本号在进入程序的时候存起来 =& ...

  3. 执行一条sql语句update多条不同值的记录实现思路

    如果你想更新多行数据,并且每行记录的各字段值都是各不一样,你会怎么办呢?本文以一个示例向大家讲解下如何实现如标题所示的情况,有此需求的朋友可以了解下 通常情况下,我们会使用以下SQL语句来更新字段值: ...

  4. 搭建Maven环境——使用本地的maven环境

    1.安装JDK. 2.Maven是 Apache 下的一个项目,官网下载 Maven:http://maven.apache.org/download.cgi 系统变量:M2_HOME= G:\vis ...

  5. rar安装和使用

    参考:http://blog.csdn.net/dracotianlong/article/details/18011033 .下载rar wget http://www.rarlab.com/rar ...

  6. python读写word文档

    读: from docx import Document dir_docx = 'F:\Eclipse\workspace\Spider\cnblogs_doc\mytest - 副本.docx' d ...

  7. php -- 实现linux关机、重启功能

    有时候,我们自己可以DIY一个控制面板实现linux的关机重启功能.众所周知,linux是一个基于文件的操作系统,所以要实现系统的关机重启功能必须满足以下两点 一.知道命令的绝对路径 在linux下操 ...

  8. 扫盲:java中关于路径的问题

    ../FileName:当前工程的上级目录. ./FileName:当前工程所在的目录. /FileName:当前工程所在磁盘的根目录(windows下). FileName:当前工程所在的目录.

  9. 转载:【原译】Erlang常见注意事项(Efficiency Guide)

    转自:http://www.cnblogs.com/futuredo/archive/2012/10/17/2726416.html Common Caveats(常见注意事项) Erlang/OTP ...

  10. 【Java面试题】38 Collection 和 Collections的区别

    Collection是集合类的一个顶级接口,其直接继承接口有List与Set 而Collections则是集合类的一个工具类/帮助类,其中提供了一系列静态方法,用于对集合中元素进行排序.搜索以及线程安 ...