起步软件技术论坛
搜索
 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 3880|回复: 3

[分享] CryptoJS加密与蓝牙开锁

[复制链接]

46

主题

118

帖子

424

积分

中级会员

Rank: 3Rank: 3

积分
424
QQ
发表于 2017-9-19 10:20:48 | 显示全部楼层 |阅读模式
本帖最后由 winterhero 于 2017-9-19 10:26 编辑

首先先感谢 wgs7909 的技术指导。终于通过1个星期加班加点把加密跟开锁解决了。
文笔不是很好,写的不好不要介意。PS 在测试的如果觉得报错弹窗很难受可以在WEX5官网查一查怎么修改报错弹窗。我这边直接改成了console.log打印。
首先是CryptoJS加密
WEX5的JS引老是有些JS引用不到核心的aes.js里的CryptoJS。
我自己的处理方法是把rollups里的aes.js混淆解密后。全部复制到引用不到CryptoJS的JS文件里。就能用
具体例子可以看mode_ecb,js。
在网上的例子都是加密String类型的字符串。蓝牙发送的数据帧是16进制。需要转换。而在CryptoJS里没用提供。
http://www.jianshu.com/p/df3e5ba5a8a4
需要添加个 CryptoJS.enc.u8array这个方法:  //我写在了enc-utf16.js里。
    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=byte;
        }
        return u8;
    },

    parse: function (u8arr) {
        var len = u8arr.length;
        var words = [];
        for (var i = 0; i < len; i++) {
            words[i >>> 2] |= (u8arr & 0xff) << (24 - (i % 4) * 8);
        }
        return CryptoJS.lib.WordArray.create(words, len);
    }
};


加密方法:

        function encrypt(codes, key) {
                var encryptkeyBytes = DataType.hexTo16Bytes(key); // 密钥,16bytes
                encryptkeyBytes = CryptoJS.enc.u8array.parse(encryptkeyBytes);

                var codeBytes = DataType.hexTo16Bytes(codes); // 内容
                codeBytes = CryptoJS.enc.u8array.parse(codeBytes);

                var encrypted = CryptoJS.AES.encrypt(codeBytes, encryptkeyBytes, {
                        mode : CryptoJS.mode.ECB,                          // 需要导入CryptoJS的ecb.js
                        padding : CryptoJS.pad.NoPadding,              // 需要导入CryptoJS的nopadding.js
                });
                console.log(encrypted.ciphertext.toString());
                return encrypted.ciphertext.toString();
               
        }
加密操作:
               Model.prototype.button2Click = function(event) {
        
                // 加密key
                var codebytes = "06010101000000000000000000000000";
                var key = "20572f52364b3f473050415811632d2b";
                var encryptedData = encrypt(codebytes, key);
        
        
        };


解密方法:
        function decrypt(encryptedStr, key) {
                var decryptkey = DataType.hexTo16Bytes(key); // 密钥,16bytes
                decryptkey = CryptoJS.enc.u8array.parse(decryptkey)
                var encryptedHexStr = CryptoJS.enc.Hex.parse(encryptedStr);   //内容
                var encryptedBase64Str = CryptoJS.enc.Base64.stringify(encryptedHexStr);
                var decryptedData = CryptoJS.AES.decrypt(encryptedBase64Str, decryptkey, {
                        mode : CryptoJS.mode.ECB,
                        padding : CryptoJS.pad.NoPadding
                });
                 window.Strencrypted = encrypted.ciphertext.toString();
                return decryptedData;
        }


解密操作:
            Model.prototype.button8Click = function(event) {

                var key = "20572f52364b3f473050415811632d2b";

        
                decrypt(window.Strencrypted, key);

        };


具体的加密解密解释可以在
https://zhidao.baidu.com/question/1819427615658816228.html  查看

蓝牙连接其实也很简单。其实我这边涉及最头痛的是连接到设备后,到广播获取随机令牌. 获取到的广播是加密的。需要解密 再去拼接字符串。一个很繁琐的操作。
但是这是现在基本上共享单车锁的基本流程:搜索蓝牙设备,连接蓝牙设备,读取广播,开锁。
具体操作可以看http://www.jianshu.com/p/df3e5ba5a8a4  或者
http://bbs.wex5.com/forum.php?mo ... =%E8%93%9D%E7%89%99


        Model.prototype.searchClick = function(event) {

                // 每发现一个设备就会成功回调一次,会记录最后一个被发现设备的id
        
                alert("扫描" + second + "秒后自动停止扫描")
                ble.scan([], second, function(info) {
                        suCallBack(info);
        
                }, errCallBack);

        };

        Model.prototype.connectClick = function(event) {
                // 连接最后一个被发现的设备
                ble.connect("FF:FF:80:04:0F:60", function(info) {
                        suCallBack(info);
                }, errCallBack);
        };

        Model.prototype.readClick = function(event) {
                var SERVICEID = "0000fee7-0000-1000-8000-00805f9b34fb";   //设备编号

                var readDataUUID = "000036f6-0000-1000-8000-00805f9b34fb";     //特征读取指令ID

                ble.read("FF:FF:80:04:0F:60", SERVICEID, readDataUUID, function(buffer) {
                        var x2 = new Uint8Array(buffer);
                        var x = new Uint8Array(16);
                        for (var int = 0; int < 16; int++) {
                                x[int] = x2[int];
                        }
                        sureadCallBack(x);                                       //我读取到的广播的长度是20 但是我的协议长度都是16, 所以在这截取了16位

                        var codeBytes = CryptoJS.enc.u8array.parse(x); // 数据转成u8
                        window.readcodeybte = codeBytes;
               
                }, errCallBack);

        };

        Model.prototype.openlock9Click = function(event) {
                var SERVICEID = "0000fee7-0000-1000-8000-00805f9b34fb";     //设备编号
                var writeDataUUID = "000036f5-0000-1000-8000-00805f9b34fb";    //特征写入指令ID
                var key = "20572f52364b3f473050415811632d2b";           
                var read= window.readcodeybte;           

                var readStr = (decrypt(read.toString(), key)).toString();
                var x3 = readStr.substring(6, 14)
                var x1 = "050106303030303030";
                var x2 = "000000"
                var Strsdata = x1 + x3 + x2;
                var encryptedData = encrypt(Strsdata, key);
                var jiami = DataType.hexTo16Bytes(encryptedData);

                ble.write("FF:FF:80:04:0F:60", SERVICEID, writeDataUUID, jiami.buffer, suCallBack, errCallBack);  //"FF:FF:80:04:0F:60"我这里就一把锁所以我把蓝牙地址写死了。

        };




CryptoJS.rar

163.96 KB, 下载次数: 197

评分

参与人数 2威望 +60 收起 理由
qiuxinw66 + 10
jishuang + 50 赞一个!

查看全部评分

QQ:737844076

46

主题

118

帖子

424

积分

中级会员

Rank: 3Rank: 3

积分
424
QQ
 楼主| 发表于 2017-9-19 10:22:22 | 显示全部楼层
本帖最后由 winterhero 于 2017-9-19 10:27 编辑

如果有看不懂的可以问我 回复我
QQ:737844076
回复 支持 反对

使用道具 举报

41

主题

837

帖子

2271

积分

金牌会员

搬砖工

Rank: 6Rank: 6

积分
2271
QQ
发表于 2017-9-19 11:16:18 | 显示全部楼层
顶!
Wex5开发者,欢迎互相交流学习
交流群:30057529


我要成为代码女神
回复

使用道具 举报

23

主题

79

帖子

211

积分

中级会员

Rank: 3Rank: 3

积分
211
QQ
发表于 2017-10-17 11:54:34 | 显示全部楼层
你好,我现测试了下,官网给的可以写,成功回调,但是硬件收不到发的信息呀,我就只是发几个数字而已,电脑用硬件的串口软件接收,收不到呀
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|X3技术论坛|Justep Inc.    

GMT+8, 2024-5-3 08:21 , Processed in 0.058787 second(s), 27 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表