使用as3crypto在Flex中实现AES加密
要在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: }
运行效果如下:

参考:
使用as3crypto在Flex中实现AES加密的更多相关文章
- 探讨.NET Core中实现AES加密和解密以及.NET Core为我们提供了什么方便!
前言 对于数据加密和解密每次我都是从网上拷贝一份,无需有太多了解,由于在.net core中对加密和解密目前全部是统一了接口,只是做具体的实现,由于遇到过问题,所以将打算基本了解下其原理,知其然足矣, ...
- nodejs与javascript中的aes加密
简介 1.aes加密简单来说,在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用.高级加密标准已然成为对称密钥加 ...
- Vue项目中使用AES加密
1.在vue中安装crypto-js 备注:千万不要安装错了,中间是 ‘-’连接,不是‘.’ 2.在项目的工具文件夹中新建 encryption.js,用于定义加密和解密的方法,方便调用 ...
- PHP、Java对称加密中的AES加密方法
PHP AES加密 <?php ini_set('default_charset','utf-8'); class AES{ public $iv = null; public $key = n ...
- JAVA中使用AES加密解密
技术交流群: 233513714 /** * AES加密测试 * * @param str 加密参数 */ public void aesTest(String str) { log.info(&qu ...
- OPENSSL安装 以及使用openssl中的AES加密和解密
OPENSSL安装:(VS) 1:第一步和所有的软件安装一样. 2:将OPENSSL中INLUCDE 和 LIB 分别拷贝到VS中VC的INLUCDE 和LIB目录下(我的机器上的目录是:C:\Pro ...
- 在Java中使用AES加密
本文转载https://blog.csdn.net/z69183787/article/details/82746686
- openssl与cryptoAPI交互AES加密解密
继上次只有CryptoAPI的加密后,这次要实现openssl的了 动机:利用CryptoAPI制作windows的IE,火狐和chrome加密控件后,这次得加上与android的加密信息交互 先前有 ...
- 探讨数据进行AES加密和解密以及.NET Core对加密和解密为我们提供了什么?
前言 对于数据加密和解密每次我都是从网上拷贝一份,无需有太多了解,由于在.net core中对加密和解密目前全部是统一了接口,只是做具体的实现,由于遇到过问题,所以将打算基本了解下其原理,知其然足矣, ...
随机推荐
- Hive Tunning(二)优化存储
接着上一章我们讲的hive的连接策略,现在我们讲一下hive的数据存储. 下面是hive支持的数据存储格式,有我们常见的文本,JSON,XML,这里我们主要讲一下ORCFile. Built-in F ...
- iOS彩票项目--第四天,新特性界面搭建,UICollectionViewController的初次使用
一.新特性界面搭建的思路: 在AppDelegate加载主窗体的时候进行判断程序版本号,直接进入程序或者进入新特性展示界面 取出当前的版本号,与旧的版本号相比较(旧的版本号在进入程序的时候存起来 =& ...
- 执行一条sql语句update多条不同值的记录实现思路
如果你想更新多行数据,并且每行记录的各字段值都是各不一样,你会怎么办呢?本文以一个示例向大家讲解下如何实现如标题所示的情况,有此需求的朋友可以了解下 通常情况下,我们会使用以下SQL语句来更新字段值: ...
- 搭建Maven环境——使用本地的maven环境
1.安装JDK. 2.Maven是 Apache 下的一个项目,官网下载 Maven:http://maven.apache.org/download.cgi 系统变量:M2_HOME= G:\vis ...
- rar安装和使用
参考:http://blog.csdn.net/dracotianlong/article/details/18011033 .下载rar wget http://www.rarlab.com/rar ...
- python读写word文档
读: from docx import Document dir_docx = 'F:\Eclipse\workspace\Spider\cnblogs_doc\mytest - 副本.docx' d ...
- php -- 实现linux关机、重启功能
有时候,我们自己可以DIY一个控制面板实现linux的关机重启功能.众所周知,linux是一个基于文件的操作系统,所以要实现系统的关机重启功能必须满足以下两点 一.知道命令的绝对路径 在linux下操 ...
- 扫盲:java中关于路径的问题
../FileName:当前工程的上级目录. ./FileName:当前工程所在的目录. /FileName:当前工程所在磁盘的根目录(windows下). FileName:当前工程所在的目录.
- 转载:【原译】Erlang常见注意事项(Efficiency Guide)
转自:http://www.cnblogs.com/futuredo/archive/2012/10/17/2726416.html Common Caveats(常见注意事项) Erlang/OTP ...
- 【Java面试题】38 Collection 和 Collections的区别
Collection是集合类的一个顶级接口,其直接继承接口有List与Set 而Collections则是集合类的一个工具类/帮助类,其中提供了一系列静态方法,用于对集合中元素进行排序.搜索以及线程安 ...