You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
// enchance for Cryptojs enc u8arrayCryptoJS.enc.u8array={/** * Converts a word array to a Uint8Array. * * @param {WordArray} wordArray The word array. * * @return {Uint8Array} The Uint8Array. * * @static * * @example * * let u8arr = CryptoJS.enc.u8array.stringify(wordArray); */stringify: function(wordArray){// Shortcutsletwords=wordArray.words;letsigBytes=wordArray.sigBytes;// Convertletu8=newUint8Array(sigBytes);for(leti=0;i<sigBytes;i++){letbyte=(words[i>>>2]>>>(24-(i%4)*8))&0xff;u8[i]=byte;}returnu8;},/** * Converts a Uint8Array to a word array. * * @param {string} u8Str The Uint8Array. * * @return {WordArray} The word array. * * @static * * @example * * let wordArray = CryptoJS.enc.u8array.parse(u8arr); */parse: function(u8arr){// Shortcutletlen=u8arr.length;// Convertletwords=[];for(leti=0;i<len;i++){words[i>>>2]|=(u8arr[i]&0xff)<<(24-(i%4)*8);}returnCryptoJS.lib.WordArray.create(words,len);}};
背景介绍
由于之前业务需求需要对服务器返回的zip包进行解压、解密。 服务器使用的是Java DES加密算法需要前端来进行解密。目前浏览器端解密库里CryptoJS算得上是比较通用的库了。而且CryptoJS加密解密算法很多支持度比较广并且网上资料丰富可以有助与我们快速完成相关业务。下面以DES加密解密为例给大家介绍一下CryptoJS加密解密一些常见问题。
ArrayBuffer、TypeArray和WordArray
总结: ArrayBuffer对象代表原始的二进制数据,TypedArray对象代表确定类型的二进制数据,DataView对象代表不确定类型的二进制数据。它们支持的数据类型一共有9种。WordArray对象是CryptoJS内部实现的一种二进制数据结构用32位数组表示。具体实现感兴趣可以参考WordArray源码
简单字符串DES加解密
对于字符串加解密比较简单我们可以直接看官方API搜DES加密即可下面给出封装代码
ArrayBuffer DES加解密
考虑到平时项目中大部分是加载一个具体的文件流进行加解密这种场景比较多所以重点讲一下。这部分官方是没有给出说明需要自己摸索。
WordArray和uInt8Array转换
由于CryptoJS中大量使用WordArray所以在加密解密文件流的时候需要和uInt8Array之间进行转换 不然解码出来可能是乱码。
下面封装的工具可以很方便提供转换,可以在引入CryptoJS时候对CryptoJS.enc做一个增强
DES加密
DES解密
在线演示
codesandbox
建议copy代码在本地运行 由于codesandbox地址saveAs会有问题。
注意点
对于这种情况一点要保证CryptoJS使用的的模式mode和padding方式和Java的一致,例如ECB mode和PKCS5Padding。由于CryptoJS只有Pkcs7 经测试Pkcs7可以兼容PKCS5Padding。具体对于mode padding感兴趣的同学可以自行google。
这个错误出现说明你解密后的数据可能出现乱码或者解密密钥错误解出来的数据不对等等情况比较多。总之就是没解对就是了,这个时候需要自己检测下流程上有没有问题,密钥是否正确。也可以和服务端加密同学讨论一下他们加密流程 看是不是先进行base64加密后使用DES加密。
由于我们加解密一般都是以文件的形式进行,所以加密时候需要把Uint8Array二进制数据转成WordArray传进来加密 ,解密的时候需要把传进来的Uint8Array转成WordArray再转成base64字符串来解密。
参考资料
https://cryptojs.gitbook.io/docs/
https://stuk.github.io/jszip/
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/TypedArray
http://www.appblog.cn/2019/07/01/CryptoJS%E4%B8%ADWordArray/
The text was updated successfully, but these errors were encountered: