公司一个蓝牙锁需要把重要协议进行加密传输,硬件结构、加密模式不变,微信小程序、安卓、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
版权声明:本文为weixin_38608490原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。