在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
公司一个蓝牙锁需要把重要协议进行加密传输,硬件结构、加密模式不变,微信小程序、安卓、IOS三端同步加解密。 百度谷歌资料查了不少,都是用CryptoJS。 加解密是没什么问题,只是跟我想要的有点不一样,我们的加密不需要偏移量,所以得稍做修改。 加密模式使用AES/ECB/NoPadding 需要用到网上找到的aes.js mode-ecb.js pad-nopadding.js文件 实际项目用在小程序 这里用JS做Demo <script src="./rollups/aes.js?v=1.1"></script> <script src="./components/mode-ecb.js?v=1.0"></script> <script src="./components/pad-nopadding.js?v=1.0"></script> 开始加密这里要注意的是
//这里是加密所需要的key var key_Int = new Int8Array([32,87,47,82,54,75,63,71,48,80,65,88,17,99,45,43]); var keyBytes = Int8parse(key_Int); // 数据解析 function Encrypt(){ //需要加密的bytes数组 var srcs_Int = new Int8Array([16,1,4,59,80,65,245,0,0,0,0,0,0,0,0,0]); var srcsBytes = Int8parse(srcs_Int); // 数据解析 var encrypted = CryptoJS.AES.encrypt(srcsBytes, keyBytes, {mode:CryptoJS.mode.ECB,padding: CryptoJS.pad.NoPadding}); return encrypted.toString(); } Int8parse() 是网上找的方法,为了解决转成wordArray的时候有的值太大造成位数超出加密失败 function Int8parse(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); } 加密完成,下面是解密解密就挺简单的了,什么都不用改,直接传加密过后的base-64字符串进去就OK function Decrypt(word){ var decrypt = CryptoJS.AES.decrypt(word, keyBytes, {mode:CryptoJS.mode.ECB,padding: CryptoJS.pad.NoPadding}); return CryptoJS.enc.Hex.stringify(decrypt).toString(); } 打印一下加解密结果 console.log(encrypted()) console.log(hexToBytes(Decrypt(encrypted))) cGLRRwWc6iCOvD9RPhgaXA== [16, 1, 4, 59, 80, 65, 245, 0, 0, 0, 0, 0, 0, 0, 0, 0] OK,大功告成。顺便附上代码链接 https://github.com/243504330/AES-ECB-NoPadding/tree/master
|
请发表评论