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算法加密和解密相关推荐

  1. AES对称加密和解密算法以及Java的AES工具类

    参考资料:百度百科[高级加密标准] AES简介 1.密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块 ...

  2. 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 加轮密钥 ...

  3. 黑客学习-密码学:基于openssl的算法加密和解密

    在Linux系统中自带openssl工具,加密和解密,可以在Linux上进行.利 openssl工具,用DES.3DES.IDEA.AES等对称算法对文件加密解密,和用RSA非对称算法对文件加密解密. ...

  4. android 中如何用aes算法加密解密zip文件,android中AES加解密的使用方法

    今天在android项目中使用AES对数据进行加解密,遇到了很多问题,网上也找了很多资料,也不行.不过最后还是让我给搞出来了,这里把这个记录下来,不要让别人走我的弯路,因为网上绝大多数的例子都是行不通 ...

  5. Javascript实现AES算法

    JavaScript的加密和解密用的是google的CryptoJS库. 需要下载CryptoJS库,下载地址如下:https://github.com/sytelus/CryptoJS AES算法 ...

  6. linux下面C 利用openssl的AES库加密,解密

    OpenSSL提供了AES加解密算法的API const char *AES_options(void); AES算法状态,是全部支持或者是部分支持. 返回值:"aes(full)" ...

  7. Python基于AESSHA1PRNG 算法 加密与解密

    因工作需要,需要对aes进行加解密,收集资料时从网上找到了核心写法代码,经小量修改满足了需求. 核心加.解密代码来自原文: https://blog.csdn.net/max229max/articl ...

  8. 编写ATL工程实现ActiveX控件调用cryptoAPI接口(三)------------AES对称加密与解密

    注:下面的代码中用了Map,Base64,log,Result等都为自定义类型,太长就不一一贴出. [cpp]  view plain  copy  print ? /* * * * 文件名称:Enc ...

  9. java gcm_JAVA中的AES GCM加密和解密

    我正在尝试在JAVA中实现AES / GCM / NoPadding加密和解密.使用的密钥是来自接收方的公钥和发送方的私钥(ECDH)的共享密钥.加密效果很好(有无iv).但是,我无法解密...... ...

最新文章

  1. 存储引擎 K/V 分离下的index回写问题
  2. 比特币的货币属性是什么?
  3. 【职场】程序员摆地摊都能月入过万,是真的吗?
  4. Linux下的字符集问题
  5. CF401C-Team【构造】
  6. 2D Perlin噪点
  7. 杨森翔的书法:立马【五绝】
  8. 谷歌也挖墙脚啊[抠鼻]
  9. 单反相机的常用的几个参数之间的关系
  10. 微软:警惕 Web3 和去中心化网络中的“冰钓”威胁
  11. 传智播客 java表单笔记_传智播客java_web笔记全套
  12. word输入带圈字符快捷键(0-20)
  13. 数字图像处理:图像直方图基础知识介绍
  14. 《Dreamweaver CS6 完全自学教程》笔记 第一章:网页制作基础知识
  15. 千古兴亡多少事,一江春水向东流--转任总文章
  16. 大蟒蛇python头像_Python微信好友头像大拼图案例
  17. 微服务容器化运维:微博容器运维平台DCP
  18. 计算机考研调剂心酸,考研,这一路走来、辛酸苦辣~百感交集~(转)
  19. 荣耀智慧屏还可以升到鸿蒙2,从荣耀智慧屏到华为智慧屏 “大屏”时代已经拉开...
  20. 英特尔第十代处理器为什么不支持win7_10代cpu能不能装win7?10代cpu装win7全面分析(支持十代...

热门文章

  1. c语言 callback回调函数
  2. java ArrayList源码分析(转载)
  3. Spring 定时器结合线程池
  4. 偶然翻开旧日记本,发现了好多的情诗(三)!!!!
  5. HTML+CSS制作Windows启动加载动画
  6. 为什么有的人洗脚时要在水里滴几滴醋?
  7. 你三十岁有什么巨大变化吗?
  8. 请问孩子厌学的话该怎么办?
  9. 哪一瞬间让你下定决心减肥,并且坚定不移的执行,最终瘦身成功?
  10. 别人都说我老公的字写的不错,大家帮我看看这字行不?