公司一个蓝牙锁需要把重要协议进行加密传输,硬件结构、加密模式不变,微信小程序、安卓、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>
开始加密
这里要注意的是
- 加密的Bytes数组里面的某个值不能超出127,需要用new Int8Array()
- CryptoJS传进去的是wordArray类型
- Int8parse()方法
//这里是加密所需要的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
————————————————
版权声明:本文为CSDN博主「秋水浮萍任飘渺」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_38608490/article/details/77113216