[转] js在浏览器端对二进制流进行AES加密和解密
开始解密
简单了解一下所用的的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加密和解密的更多相关文章
- [转] js实现对图片的二进制流md5计算
		
//计算图片md5 function img_MD5(img_path,callback) { plus.io.resolveLocalFileSystemURL(img_path, function ...
 - Javascript中双等号(==)隐性转换机制    JS里charCodeAt()和fromCharCode()方法拓展应用:加密与解密
		
Javascript中双等号(==)隐性转换机制 在Javascript中判断相等关系有双等号(==)和三等号(===)两种.其中双等号(==)是值相等,而三等号(===)是严格相等(值及类型是否 ...
 - JS里charCodeAt()和fromCharCode()方法拓展应用:加密与解密
		
JS实现客户端的网页加密解密技术,可用作选择性隐蔽展示.当然客户端的加密安全度是不能与服务器相提并论,肯定不能用于密码这类内容的加密,但对于一般级别的内容用作展示已经够了. JS加密与解密的解决方案有 ...
 - 遵循amd规范的require.js(适合浏览器端)
		
1. 下载require.js 2. 引用 html <!DOCTYPE html> <html lang="en"> <head> <m ...
 - php canvas 前端JS压缩,获取图片二进制流数据并上传
		
<?php if(isset($_GET['upload']) && $_GET['upload'] == 'img'){ //二进制数据流 $data = file_get_c ...
 - js 显示 base64编码 的二进制流 图片
		
Data URI scheme.Data URI scheme是在RFC2397中定义的,目的是将一些小的数据,直接嵌入到网页中,从而不用再从外部文件载入.比如上面那串字符,其实是一张小图片,将这些字 ...
 - js读取cookie,并利用encrypt和decrypt加密和解密方法
		
以下为支持encrypt和decrypt加密和解密方法 eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a ...
 - 浏览器端JS导出EXCEL
		
浏览器端JS导出EXCEL FileSaver.js 实现了在本身不支持 HTML5 W3C saveAs() FileSaver 接口的浏览器支持文件保存.FileSaver.js 在客户端保存文件 ...
 - JS和利用openssl的object C加密得到相同的aes加密密文
		
这是之前接到的一个工作内容,项目原本的登录操作是获得账号和密码以后,对密码进行一遍MD5加密,然后传递账号和密文到cgi文件.在c中获取到账户以后,从数据库中获取到密码,对密码进行一次MD5的加密,然 ...
 
随机推荐
- 如何在Delphi 中使用 DevExpressVCL的 CxGrid与CxTreeList,编辑某列后计算另一列的值
			
如何在Delphi 中使用 DevExpressVCL的 CxGrid与CxTreeList,编辑某列后计算另一列的值:比如 输入 单价,数量,计算金额. 参考: 1. 输入 单价,数量,计算金额 ...
 - Python3学习笔记33-正则表达式
			
学习文章传送门 正则表达式是用来匹配字符串的.只要符合规则的字符串.就可以认为匹配了.否则,这个字符串不合法. \d:可以匹配一个数字 ‘00\d’可以匹配001不能匹配00A \w:可以匹配 ...
 - Unity-Rigidbody碰撞穿透
			
首先,说说碰撞的条件:1.rigidbody(刚体),一般用在主动移动的物体上,比如角色.2.collider,碰撞器,一般用于受力物体上,比如障碍块. 发生概率即触发方式: 1.刚体速度足够快,被撞 ...
 - Docker部署tomcat及应用
			
前提Docker已安装完成. 由于测试网无法直接连入互联网,所以在本机虚拟机内下载tomcat镜像并传到测试网主机中. 虚拟机内执行 查找tomcat镜像: # docker search tomca ...
 - 我的大学,我的SPR机器人队
			
时间过的真快,我这个在协会呆了好多年的老油条今年都毕业了,在石油大学大学七年几乎三分之二的时间就是在协会度过的.实话说在北京这是我最亲切的地方,这里有我喜欢的各种设备,有亲爱的老师和一起奋斗的队友,在 ...
 - ASP.NET如何下载大文件
			
关于此代码的几点说明: 1. 将数据分成较小的部分,然后将其移动到输出流以供下载,从而获取这些数据. 2. 根据下载的文件类型来指定 Response.ContentType .(参考OSChina的 ...
 - Inspector did not run successfully.
			
装虚拟机,卡在这个报错1天了, server没有问题,其余所有的agent都不能运行. 这部分没有日志,只有单纯的报错信息,omg,百度.bing一顿骚操作,还是没有解决问题. 因为默认安装jdk1. ...
 - 【进阶1-4期】JavaScript深入之带你走进内存机制(转)
			
这是我在公众号(高级前端进阶)看到的文章,现在做笔记 https://mp.weixin.qq.com/s/yK4DPKhkmkiroasWJMrJcw 阅读笔记 JS内存空间分为栈(stack).堆 ...
 - tensorflow中文教程
			
飞机票--->走你~~~ 飞机票 http://blog.csdn.net/lenbow/article/details/52152766
 - WebSocket异步通讯,实时返回数据实例
			
定义类中的异步方法 using System;using System.Collections.Generic;using System.IO;using System.Linq;using Syst ...