JavaScript实现AES算法加密和解密
JavaScript的加密和解密用的是google的CryptoJS库。本文以AES/ECB/NoPadding为例展示AES加密和解密的方法。
需要下载CryptoJS库,下载地址如下:
https://github.com/sytelus/CryptoJS
需要引入库文件:
<script src="./CryptoJS-master/rollups/aes.js"></script>
<script src="./CryptoJS-master/components/mode-ecb.js"></script>
<script src="./CryptoJS-master/components/pad-nopadding.js"></script>
加密方法:
function encrypt(str) {var decArray = hexStrToDecArray(str);var wordArray = int8parse(decArray);var encrypted = CryptoJS.AES.encrypt(wordArray, aesKeyBytes(), {mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.NoPadding});return wordArrayToHexStr(encrypted.ciphertext.words); }
这个方法传入的是十六进制字符串,格式为"AA BB CC DD EE FF";
hexStrToDecArray()方法用来将十六进制字符串转换成十进制数字的数组;
int8parse()方法用来将十进制数字转换成CryptoJS所需要的wordArray数组;
最后,encrypt()方法加密得到的是一个wordArray数组,wordArrayToHexStr()再将其解析成十六进制字符串。
解密方法:
function decrypt(str) {var decArray = hexStrToDecArray(str);var wordArray = int8parse(decArray);var base64Str = CryptoJS.enc.Base64.stringify(wordArray);var decrypted = CryptoJS.AES.decrypt(base64Str, aesKeyBytes(), {mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.NoPadding});return wordArrayToHexStr(decrypted.words); }
解密方法同加密方法类似,但是CryptoJS.AES.decrypt()方法需要传入Base64格式的加密字符串,因此这里需要先使用CryptoJS.enc.Base64.stringify()方法做一次转换。
以下是完整的Demo代码:
<!DOCTYPE html> <html> <head> <script src="./CryptoJS-master/rollups/aes.js"></script> <script src="./CryptoJS-master/components/mode-ecb.js"></script> <script src="./CryptoJS-master/components/pad-nopadding.js"></script> <script> function encryptText() {var plain = document.getElementById("plain").value;console.log("plain: " + plain);var encrypted = encrypt(plain);console.log("encrypted: " + encrypted);document.getElementById("encrypted").value = encrypted; }function decryptText() {var encrypted = document.getElementById("todecrypt").value;console.log("encrypted: " + encrypted);var decrypted = decrypt(encrypted);console.log("decrypted: " + decrypted);document.getElementById("decrypted").value = decrypted; }// 加解密用到的密钥 function aesKeyBytes() {var key_Int = new Int8Array([65, 144, 48, 53, 18, 52, 86, 120, 131, 116, 124, 139, 237, 203, 169, 135]);var keyBytes = int8parse(key_Int);return keyBytes; }// 十六进制字符串数组,个数如果不足16整数倍则补0 function hexTo16Hex(str) {var diff = 16 - (str.length + 1) / 3 % 16;for(var i = 0; i < diff; i++) {str = str + " 00";}return str; }// AES加密 function encrypt(str) {var decArray = hexStrToDecArray(str);var wordArray = int8parse(decArray);var encrypted = CryptoJS.AES.encrypt(wordArray, aesKeyBytes(), {mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.NoPadding});return wordArrayToHexStr(encrypted.ciphertext.words); }// AES解密 function decrypt(str) {var decArray = hexStrToDecArray(str);var wordArray = int8parse(decArray);var base64Str = CryptoJS.enc.Base64.stringify(wordArray);var decrypted = CryptoJS.AES.decrypt(base64Str, aesKeyBytes(), {mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.NoPadding});return wordArrayToHexStr(decrypted.words); }// 构建WordArray对象 function int8parse(u8arr) {var len = u8arr.length;var words = [];for (var i = 0; i < len; i++) {words[i >>> 2] |= (u8arr[i] & 0xff) << (24 - (i % 4) * 8);}return CryptoJS.lib.WordArray.create(words, len); }// 十六进制字符串(空格分割)转成十进制数字的数组 function hexStrToDecArray(str) {var strArray = str.split(" ");var decArray = [];for(var i = 0; i < strArray.length; i++) {decArray.push(parseInt(strArray[i], 16));}return arrayTo16Array(decArray); }// 十进制数组转成十六进制字符串 function decArrayToHexStr(array) {var hexStr = "";for(var i = 0; i < array.length; i++) {var str = array[i].toString(16).toUpperCase();if (str.length < 2) {str = "0" + str;}hexStr = hexStr + str + " ";}return hexStr.substr(0, hexStr.length - 1); }// word类型的十进制数组转成十六进制字符串 function wordArrayToHexStr(array) {var hexStr = "";for(var i = 0; i < array.length; i++) {var num = array[i];if (num < 0) {num = array[i] + 0x100000000;}var str = num.toString(16).toUpperCase();var fullStr = str;if (str.length < 8) {for(var j = 0; j < 8 - str.length; j++) {fullStr = "0" + fullStr;}}hexStr = hexStr + fullStr;}var ret = "";for(var i = 0; i < hexStr.length; i += 2) {ret = ret + hexStr.substr(i, 2) + " "}return ret.substr(0, ret.length - 1); }// 数组元素个数必须是16的整数倍,不足的在后面补0 function arrayTo16Array(array) {var len = array.length;var distLen = parseInt((array.length - 1) / 16) * 16 + 16;for(var i = array.length; i < distLen; i++) {array[i] = 0;}return array; } </script> </head> <body><h1>加解密测试</h1>AES128,ECB模式,PaddingModeZeros,不足部分补0<br><input id="plain" type="text" style="width:500px; height:20px;"/><button type="button" onclick="encryptText()">加密</button><input id="encrypted" type="text" style="width:500px; height:20px;" /><br><br><br><input id="todecrypt" type="text" style="width:500px; height:20px;"/><button type="button" onclick="decryptText()">解密</button><input id="decrypted" type="text" style="width:500px; height:20px;" /> </body> </html>
在浏览器中打开之后效果如下:
输入要加密或解密的字符串,点击加密/解密按钮即可。
转载于:https://www.cnblogs.com/lasdaybg/p/9971285.html
JavaScript实现AES算法加密和解密相关推荐
- AES对称加密和解密算法以及Java的AES工具类
参考资料:百度百科[高级加密标准] AES简介 1.密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块 ...
- Android直播开发之旅(25):使用AES算法加密多媒体文件(+RSA+MD5+Base64)
文章目录 1. AES算法 1.1 AES加密过程 1.1.1 字节代替(SubBytes) 1.1.2 行移位(ShiftRows) 1.1.3 列混合(MixColumns) 1.1.4 加轮密钥 ...
- 黑客学习-密码学:基于openssl的算法加密和解密
在Linux系统中自带openssl工具,加密和解密,可以在Linux上进行.利 openssl工具,用DES.3DES.IDEA.AES等对称算法对文件加密解密,和用RSA非对称算法对文件加密解密. ...
- android 中如何用aes算法加密解密zip文件,android中AES加解密的使用方法
今天在android项目中使用AES对数据进行加解密,遇到了很多问题,网上也找了很多资料,也不行.不过最后还是让我给搞出来了,这里把这个记录下来,不要让别人走我的弯路,因为网上绝大多数的例子都是行不通 ...
- Javascript实现AES算法
JavaScript的加密和解密用的是google的CryptoJS库. 需要下载CryptoJS库,下载地址如下:https://github.com/sytelus/CryptoJS AES算法 ...
- linux下面C 利用openssl的AES库加密,解密
OpenSSL提供了AES加解密算法的API const char *AES_options(void); AES算法状态,是全部支持或者是部分支持. 返回值:"aes(full)" ...
- Python基于AESSHA1PRNG 算法 加密与解密
因工作需要,需要对aes进行加解密,收集资料时从网上找到了核心写法代码,经小量修改满足了需求. 核心加.解密代码来自原文: https://blog.csdn.net/max229max/articl ...
- 编写ATL工程实现ActiveX控件调用cryptoAPI接口(三)------------AES对称加密与解密
注:下面的代码中用了Map,Base64,log,Result等都为自定义类型,太长就不一一贴出. [cpp] view plain copy print ? /* * * * 文件名称:Enc ...
- java gcm_JAVA中的AES GCM加密和解密
我正在尝试在JAVA中实现AES / GCM / NoPadding加密和解密.使用的密钥是来自接收方的公钥和发送方的私钥(ECDH)的共享密钥.加密效果很好(有无iv).但是,我无法解密...... ...
最新文章
- 存储引擎 K/V 分离下的index回写问题
- 比特币的货币属性是什么?
- 【职场】程序员摆地摊都能月入过万,是真的吗?
- Linux下的字符集问题
- CF401C-Team【构造】
- 2D Perlin噪点
- 杨森翔的书法:立马【五绝】
- 谷歌也挖墙脚啊[抠鼻]
- 单反相机的常用的几个参数之间的关系
- 微软:警惕 Web3 和去中心化网络中的“冰钓”威胁
- 传智播客 java表单笔记_传智播客java_web笔记全套
- word输入带圈字符快捷键(0-20)
- 数字图像处理:图像直方图基础知识介绍
- 《Dreamweaver CS6 完全自学教程》笔记 第一章:网页制作基础知识
- 千古兴亡多少事,一江春水向东流--转任总文章
- 大蟒蛇python头像_Python微信好友头像大拼图案例
- 微服务容器化运维:微博容器运维平台DCP
- 计算机考研调剂心酸,考研,这一路走来、辛酸苦辣~百感交集~(转)
- 荣耀智慧屏还可以升到鸿蒙2,从荣耀智慧屏到华为智慧屏 “大屏”时代已经拉开...
- 英特尔第十代处理器为什么不支持win7_10代cpu能不能装win7?10代cpu装win7全面分析(支持十代...