[转] js在浏览器端对二进制流进行AES加密和解密

时间:2023-01-04 15:33:45

开始解密

简单了解一下所用的的AES加密算法,我们用的是AES的CFB加密方式,服务端会提供给我一个key和iv的二进制字节串。密文也是二进制字节串。

我用的加密/解密插件: crypto-js

一般的应用场景下,key和iv以及密文都是字符串,按照网上的教程基本上很快就能搞出来了。
这里只简述一下key、iv、密文均为二进制字节串的情况下怎么用crypto-js来解密。

需要引进下面几个js:

<script src="aes.js"></script>
<script src="mode-cfb.js"></script>
<script src="pad-nopadding.js"></script>
<script src="lib-typedarrays.js"></script>
<script src="enc-base64.js"></script>
<script src="js/lib/enc-u8array.js"></script> <!-- 注意一下这个,并不在插件源文件中 -->

注意一下最后一个文件,是我从网上摘录的,在插件源文件中是没有的。内容如下:

CryptoJS.enc.u8array = {
/**
* Converts a word array to a Uint8Array.
*
* @param {WordArray} wordArray The word array.
*
* @return {Uint8Array} The Uint8Array.
*
* @static
*
* @example
*
* var u8arr = CryptoJS.enc.u8array.stringify(wordArray);
*/
stringify: function (wordArray) {
// Shortcuts
var words = wordArray.words;
var sigBytes = wordArray.sigBytes;
// Convert
var u8 = new Uint8Array(sigBytes);
for (var i = 0; i < sigBytes; i++) {
var byte = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
u8[i]=byte;
}
return u8;
},
/**
* Converts a Uint8Array to a word array.
*
* @param {string} u8Str The Uint8Array.
*
* @return {WordArray} The word array.
*
* @static
*
* @example
*
* var wordArray = CryptoJS.enc.u8array.parse(u8arr);
*/
parse: function (u8arr) {
// Shortcut
var len = u8arr.length;
// Convert
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);
}
};

插件本身提供一个key、iv、明文均是WordArray的加密方法,而这个WordArray的数据格式长得非常像uint8数据,而
这个组件的组件的功能就是是uint8数组和WordArray之间的互相转换。
那么有了它我们就可以进行加解密了。

 
// 服务端提供的32位key
var akey = [0x26,0xAF,0xE2,0x1A,0x0C,0x16,0x73,0x54,0x13,0xFD,0x68,0xDD,0x8F,0xA0,0xB7,0xC1,0x57,0xA6,0x90,0xFF,0xCD,0xB3,0x54,0x61,0x10,0x07,0xD5,0x7E,0xDB,0x1E,0x4C,0xE9];
// 服务端提供的16位iv
var aiv = [0x15,0x4C,0xD3,0x55,0xFE,0xA1,0xFF,0x01,0x00,0x34,0xAB,0x22,0x08,0x4F,0x13,0x07];
 
// 将key和iv转换成uint8数组
var keyBv = new Uint8Array(akey);
var ivBv = new Uint8Array(aiv);
 
// 将key和iv转换成WordArray
keyWA = CryptoJS.enc.u8array.parse(keyBv);
ivWA = CryptoJS.enc.u8array.parse(ivBv);
 
// 解密方法 传入密文的uint8数组
function decryptU8arry(array) {
var acontent = array;
// 将密文转换成WordArray
contentWA = CryptoJS.enc.u8array.parse(acontent);
// 插件要求密文是base64格式
var dcBase64String = contentWA.toString(CryptoJS.enc.Base64);
// 解密 选定mode是CFB类型,无偏移量
var decrypted = CryptoJS.AES.decrypt(dcBase64String, keyWA, { iv: ivWA,mode:CryptoJS.mode.CFB,padding:CryptoJS.pad.NoPadding});
// 将解密后的明文转回uint8数组
var bv = CryptoJS.enc.u8array.stringify(decrypted);
return bv;
}
 
// 加密方法 传入明文的uint8数组
function encryptU8arry(array) {
var acontent = array;
// 将明文转换成WordArray
contentWA = CryptoJS.enc.u8array.parse(acontent);
// 插件要求明文是base64格式
var dcBase64String = contentWA.toString(CryptoJS.enc.Base64);
// 加密 选定mode是CFB类型,无偏移量
var encrypted = CryptoJS.AES.encrypt(contentWA, keyWA, { iv: ivWA,mode:CryptoJS.mode.CFB,padding:CryptoJS.pad.NoPadding});
// 将密文转回uint8数组
var bv = CryptoJS.enc.u8array.stringify(encrypted.ciphertext);
return bv;
}

由此可以对二进制流进行加密解密了:

var aData = [0,1,2,3,4];
var dv = new Uint8Array(aData);
var enu8 = encryptU8arry(dv); // 加密后的二进制流
console.log(enu8);
var deu8 = decryptU8arry(enu8); // 解密后的二进制流
console.log(deu8);

[转] js在浏览器端对二进制流进行AES加密和解密的更多相关文章

  1. &lbrack;转&rsqb; js实现对图片的二进制流md5计算

    //计算图片md5 function img_MD5(img_path,callback) { plus.io.resolveLocalFileSystemURL(img_path, function ...

  2. Javascript中双等号&lpar;&equals;&equals;&rpar;隐性转换机制 JS里charCodeAt&lpar;&rpar;和fromCharCode&lpar;&rpar;方法拓展应用:加密与解密

    Javascript中双等号(==)隐性转换机制   在Javascript中判断相等关系有双等号(==)和三等号(===)两种.其中双等号(==)是值相等,而三等号(===)是严格相等(值及类型是否 ...

  3. JS里charCodeAt&lpar;&rpar;和fromCharCode&lpar;&rpar;方法拓展应用:加密与解密

    JS实现客户端的网页加密解密技术,可用作选择性隐蔽展示.当然客户端的加密安全度是不能与服务器相提并论,肯定不能用于密码这类内容的加密,但对于一般级别的内容用作展示已经够了. JS加密与解密的解决方案有 ...

  4. 遵循amd规范的require&period;js&lpar;适合浏览器端&rpar;

    1. 下载require.js 2. 引用 html <!DOCTYPE html> <html lang="en"> <head> <m ...

  5. php canvas 前端JS压缩,获取图片二进制流数据并上传

    <?php if(isset($_GET['upload']) && $_GET['upload'] == 'img'){ //二进制数据流 $data = file_get_c ...

  6. js 显示 base64编码 的二进制流 图片

    Data URI scheme.Data URI scheme是在RFC2397中定义的,目的是将一些小的数据,直接嵌入到网页中,从而不用再从外部文件载入.比如上面那串字符,其实是一张小图片,将这些字 ...

  7. js读取cookie,并利用encrypt和decrypt加密和解密方法

    以下为支持encrypt和decrypt加密和解密方法 eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a ...

  8. 浏览器端JS导出EXCEL

    浏览器端JS导出EXCEL FileSaver.js 实现了在本身不支持 HTML5 W3C saveAs() FileSaver 接口的浏览器支持文件保存.FileSaver.js 在客户端保存文件 ...

  9. JS和利用openssl的object C加密得到相同的aes加密密文

    这是之前接到的一个工作内容,项目原本的登录操作是获得账号和密码以后,对密码进行一遍MD5加密,然后传递账号和密文到cgi文件.在c中获取到账户以后,从数据库中获取到密码,对密码进行一次MD5的加密,然 ...

随机推荐

  1. LAMP&lowbar;源码安装全教程

    第一步:准备安装软件 httpd-2.4.7.tar.gz, apr-1.4.6.tar.gz, apr-util-1.4.1.tar.gz,mysql-5.5.tar.gz,php-5.4.tar. ...

  2. 禅道bug安装报错

    [root@lnmp src]# grep "session.save" /etc/php.ini ; http://php.net/session.save-handler se ...

  3. &lbrack;XJOI NOI02015训练题7&rsqb; B 线线线 【二分】

    题目链接:XJOI - NOI2015-07 - B 题目分析 题意:过一个点 P 的所有直线,与点集 Q 的最小距离是多少?一条直线与点集的距离定义为点集中每个点与直线距离的最大值. 题解:二分答案 ...

  4. Java基础知识强化87:BigInteger类之BigInteger加减乘除法的使用

    1. BigInteger加减乘除法的使用 public BigInteger add(BigInteger val):加 public BigInteger subtract(BigInteger ...

  5. 再见乱码:5分钟读懂MySQL字符集设置

    一.内容概述 在MySQL的使用过程中,了解字符集.字符序的概念,以及不同设置对数据存储.比较的影响非常重要.不少同学在日常工作中遇到的"乱码"问题,很有可能就是因为对字符集与字符 ...

  6. Redis入门---字符串类型

    阅读目录 1.keys * 命令 2.判断一个键是否存在(exists key) 3.删除键 4.获取键值的数据类型 5 递增数字(incr) 6.增加指定的整数 (INCRBY) 7.减少指定的整数 ...

  7. shell 三剑客

    grep 过滤来自一个文件或标准输入匹配模式内容. 除了grep外,还有egrep.fgrep.egrep是grep的扩展,相当于grep -E.fgrep相当于grep -f,用的少. Usage: ...

  8. epoll惊群原因分析

    考虑如下情况(实际一般不会做,这里只是举个例子): 在主线程中创建一个socket.绑定到本地端口并监听 在主线程中创建一个epoll实例(epoll_create(2)) 将监听socket添加到e ...

  9. Linux系统安装workerman&comma;启动wss 服务

    安装workerman其实很简单,只要会简单的linux口令就可以搞定, 这里我给大家演示一下如何安装workerman 进入终端的过程就不用演示了吧... 输入root及密码进入终端后找到站点根目录 ...

  10. 期初付年金(annuity-due)

    含义:在 n 个时期,每个时期初付款1元. ——期初付年金的现值因子 ——期初付年金的积累值因子 关系: 二.期初付年金和期末付年金的关系