java byte加密_java与js进行字节加密通信

java端使用基于netty的websocket,java端怎么发送和接收字节数据包在此不做赘述,本文重点是js前端websocket怎么利用CryptoJS对字节数据进行加解密(js websocket在此也不做赘述)。

一般我们使用CryptoJS进行加解密都是基于字符串的,网上很难找到一篇js对字节数据进行加解密,当然我下面的内容也是借鉴的网上一篇博文(对不住作者了,原网址没保存,一下子难找就没找了),不过按照他的代码照搬下来后发现他自己的加密不能被自己解密,这就有点坑了,中间还转了一层Base64,影响性能。

动手干起来,借鉴的博文主要还是没有逃离CryptoJS依据字符串进行加解密,但它的确也能对字节数据进行加解密,只是中间有些环节错了。下面简单介绍下CryptoJS,这款加密组件是比较出名的,网上一般使用都是基于字符串进行加解密,但很多人理解错了,其实它的本质是基于自有类WordArray进行加解密(这个是重点)。

那么重点来了,WordArray怎么和字节数据相互转换呢?上篇提及的博文给了我很大的启发——使用Uint8Array作为byte与WordArray的中间结构进行相互转换,函数如下:

CryptoJS.enc.Uint8Array = {

/**

* WordArray转Uint8Array

* @param wordArray

* @returns {Uint8Array}

*/

stringify: function (wordArray) {

var words = wordArray.words;

var sigBytes = wordArray.sigBytes;

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;

},

/**

* Uint8Array转WordArray

* @param u8arr

* @returns {WordArray}

*/

parse: function (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);

}

};

这个代码很好理解,就是扩展CryptoJs函数,用于Uint8Array和WordArray的相互转换。在js中字节数组和Uint8Array相互转换这个就相对简单,资料也很多,一查就有。

下面又是个重点了,基于CryptoJs DES(CBC pksc7模式)进行加解密,废话不多说,直接上码走起

var password = "88888888";

var keyWA = CryptoJS.enc.Utf8.parse(password); //秘钥

var ivWA = CryptoJS.enc.Utf8.parse(password); //加密向量,偷懒和秘钥相同

// 解密方法 传入密文的uint8数组

function decryptUint8Arry(uint8array) {

var wordArray = CryptoJS.enc.Uint8Array.parse(uint8array);

var decrypted = CryptoJS.DES.decrypt({

ciphertext: wordArray //这行是重点,上面提及的博文是依据base64编码后的数据进行加密,是错误的做法

}, keyWA, {

iv: ivWA,

mode: CryptoJS.mode.CBC,

padding: CryptoJS.pad.Pkcs7

});

var bv = CryptoJS.enc.Uint8Array.stringify(decrypted);

return bv;

}

// 加密方法 传入明文的uint8数组

function encryptUint8Arry(uint8array) {

var wordArray = CryptoJS.enc.Uint8Array.parse(uint8array);

var encrypted = CryptoJS.DES.encrypt(wordArray, keyWA, {

iv: ivWA,

mode: CryptoJS.mode.CBC,

padding: CryptoJS.pad.Pkcs7

});

var bv = CryptoJS.enc.Uint8Array.stringify(encrypted.ciphertext);

return bv;

}

测试如下:

var strWordArray = CryptoJS.enc.Utf8.parse('我爱我家');

var strUint8Array = CryptoJS.enc.Uint8Array.stringify(strWordArray);

var desUint8Array = encryptUint8Arry(strUint8Array);

var u8arr = decryptUint8Arry(desUint8Array);

var wordArray = CryptoJS.enc.Uint8Array.parse(u8arr);

var content = CryptoJS.enc.Utf8.stringify(wordArray);

console.log(content); //能够正常还原被加密数据的,输出也是'我爱我家'

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
<br> 系统介绍<br> JavaClass文件加密专家是一款针对Java应用程序Class二进制文件加密的软件,系统核心由纯C语言编写,运行效率极<br>高。传统的Java程序加密的方式多为代码混迹方式,但是无论多么复杂的混迹方式,在使用Java代码反编译程序后还是可以看<br>到代码的逻辑结构,这样并没有彻底的保护好您的代码。<br> JavaClass文件加密专家通过分析Class文件的结构,将Class二进制代码中耗时较多的部份抽出并替换为Native C代码,<br>并且使用1024位加密算法将Class文件数据加密,任何Java反编译工具均不可能对加密后的文件进行破解。<br><br> 系统特点<br> 1.采用纯C语言开发的内核算法,运行速度极快。<br> 2.抽出了JVM虚拟机耗时较多的代码,替换为原生C代码去执行,加密后的Class文件运行效率比加密前还要快。<br> 3.彻底保护您的Class二进制文件,任何通过分析Class文件结构来实现反编译的工具均不能对加密后的文件反编译。<br><br> 使用方法<br> 在要分发您的Java应用程序前,使用JavaClass文件加密专家对所有的Class文件或Jar文件进行加密,在您的系统运行参<br>数中加入以下内容:<br> 1.WEB应用程序<br> 在您使用的Java Web Server的启动参数中,增加以下内容: -agentlib:<brainysoft.dll的存放目录>\brainysoft即<br>可。<br> 举例 :<br> 假设您的Java Web Server为Tomcat,以Windows平台为例,Tomcat的存放目录为C:\Tomcat 5.5 ,brainysoft.dll存<br>放在c:\windows目录中,在Tomcat的bin目录中新建一个文件setenv.bat,setenv.bat中的内容:set JAVA_OPTS= -<br>agentlib:c:\windows\brainysoft %JAVA_OPTS%,保存setenv.bat文件,重新启动Tomcat后就可以正确加载加密类了。<br> 2.独立的Java应用程序<br> 在您的应用程序运行参数中加入以下内容: -agentlib:<brainysoft.dll的存放目录>\brainysoft<br> 举例:<br> Test.class文件的package为com.test, 在运行您的Test.class或Jar时使用以下方式:java -agentlib:<br><brainysoft.dll的存放目录>\brainysoft <-classpath 您的.jar文件> com.test.Test。<br> 3.EJB组件<br> 运行加密后的EJB组件的方式与运行WEB应用程序类似,找到您的EJB容器的启动配置文件,加入-agentlib:<br><brainysoft.dll的存放目录>\brainysoft 即可。<br><br> 应用环境<br> JavaClass文件加密专家只能用在JDK1.5及更新版本的JDK中,您在Windows平台下加密后的Class文件不必再修改就可以应<br>用于Linux、Unix等平台中。<br>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值