From 3b31e121da3b9d3ad53b75b3db7a7601a510c40c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AD=8F=E5=B0=91=E9=98=B3?= <786612630@qq.com> Date: Thu, 10 Aug 2023 09:52:05 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E5=8A=A0=E8=A7=A3=E5=AF=86?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- star_lock/lib/blue/blue_manage.dart | 4 +- .../blue/io_protocol/io_getPrivateKey.dart | 53 +++++++++++++--- .../lib/blue/io_protocol/io_getPublicKey.dart | 3 +- star_lock/lib/blue/io_tool/cbc.dart | 61 +++++++++++++++++++ star_lock/lib/blue/io_tool/io_tool.dart | 21 ++++--- star_lock/lib/blue/sender_manage.dart | 17 ++++++ star_lock/pubspec.yaml | 1 + 7 files changed, 141 insertions(+), 19 deletions(-) diff --git a/star_lock/lib/blue/blue_manage.dart b/star_lock/lib/blue/blue_manage.dart index 5a6b956a..2be277ab 100644 --- a/star_lock/lib/blue/blue_manage.dart +++ b/star_lock/lib/blue/blue_manage.dart @@ -145,7 +145,7 @@ class BlueManage{ // 写入 Future writeCharacteristicWithResponse(QualifiedCharacteristic characteristic, List value) async { - print('Write with characteristicId:${characteristic.characteristicId} serviceId:${characteristic.serviceId} deviceId:${characteristic.deviceId} value : $value'); + print('Write with characteristicId:${characteristic.characteristicId} serviceId:${characteristic.serviceId} deviceId:${characteristic.deviceId} value : $value hexStr:${radixString(value)}'); try { List valueList = value; @@ -156,7 +156,7 @@ class BlueManage{ await _flutterReactiveBle!.writeCharacteristicWithResponse(characteristic, value: subData[i]).then((value) async { await Future.delayed(const Duration(milliseconds: 1)) .then((value) async { - print('成功了么'); + print('分包发送成功了'); }); }); } diff --git a/star_lock/lib/blue/io_protocol/io_getPrivateKey.dart b/star_lock/lib/blue/io_protocol/io_getPrivateKey.dart index d54a5f0a..1e4dd1fb 100644 --- a/star_lock/lib/blue/io_protocol/io_getPrivateKey.dart +++ b/star_lock/lib/blue/io_protocol/io_getPrivateKey.dart @@ -1,30 +1,33 @@ import 'dart:convert'; +import '../../tools/storage.dart'; import '../io_tool/io_tool.dart'; import 'io_reply.dart'; import 'io_sender.dart'; import 'io_type.dart'; +import 'package:crypto/crypto.dart' as a; + class GetPrivateKeyCommand extends SenderProtocol { String? lockID; String? keyID; // 钥匙ID String? authUserID; // 钥匙授权人ID int? nowTime; - String? authCode; int? needAuthor; GetPrivateKeyCommand({ this.lockID, this.keyID, this.authUserID, this.nowTime, - this.authCode, + this.needAuthor, }) : super(CommandType.getLockPrivateKey); @override List messageDetail() { List data = []; + List ebcData = []; print("lockID:${lockID!} lockID.utf8.encode${utf8.encode(lockID!)}"); // 锁id @@ -43,19 +46,51 @@ class GetPrivateKeyCommand extends SenderProtocol { data = getFixedLengthList(data, 20 - authUserIDLength); //NowTime 4 - DateTime now = DateTime.now(); - int timestamp = now.millisecondsSinceEpoch; - data.add((timestamp & 0xff000000) >> 24); - data.add((timestamp & 0xff0000) >> 16); - data.add((timestamp & 0xff00) >> 8); - data.add((timestamp & 0xff)); + // DateTime now = DateTime.now(); + // int timestamp = now.millisecondsSinceEpoch; + var d1 = 0x11223344; + data.add((d1 & 0xff000000) >> 24); + data.add((d1 & 0xff0000) >> 16); + data.add((d1 & 0xff00) >> 8); + data.add((d1 & 0xff)); if(needAuthor == 0){ data.add(0); }else{ + List authCodeData = []; + //KeyID + authCodeData.addAll(utf8.encode(keyID!)); + + //authUserID + authCodeData.addAll(utf8.encode(authUserID!)); + + //NowTime 4 + // DateTime now = DateTime.now(); + // int timestamp = now.millisecondsSinceEpoch; + var d1 = 0x11223344; + authCodeData.add((d1 & 0xff000000) >> 24); + authCodeData.add((d1 & 0xff0000) >> 16); + authCodeData.add((d1 & 0xff00) >> 8); + authCodeData.add((d1 & 0xff)); + + var pubKey = Storage.getData("bluePublicKey"); + List pubKeyData = utf8.encode(pubKey.toString()); + authCodeData.addAll(pubKeyData); + + // var stringEncoded = md5Crypto(authCodeData); + // data.add(stringEncoded.length); + + var authCode = a.md5.convert(authCodeData); + print("authCodeData:$authCodeData authCode:$authCode"); + + data.add(authCode.bytes.length); + data.addAll(authCode.bytes); + + print("authCode:$authCode authCode.bytes.length:${authCode.bytes.length} data:$data ebcData$ebcData"); } - return data; + ebcData = getDNSAPIStr(data, "TMH_c3570480da8d").bytes; + return ebcData; } } diff --git a/star_lock/lib/blue/io_protocol/io_getPublicKey.dart b/star_lock/lib/blue/io_protocol/io_getPublicKey.dart index 7180abd0..0193687a 100644 --- a/star_lock/lib/blue/io_protocol/io_getPublicKey.dart +++ b/star_lock/lib/blue/io_protocol/io_getPublicKey.dart @@ -3,6 +3,7 @@ import 'dart:typed_data'; import '../../tools/storage.dart'; import '../io_tool/io_tool.dart'; +import '../sender_manage.dart'; import 'io_reply.dart'; import 'io_sender.dart'; import 'io_type.dart'; @@ -38,7 +39,7 @@ class GetPublicKeyReply extends Reply { print('获取公钥成功 publickey:$stringEncoded'); // 储存公钥 Storage.setData("bluePublicKey", stringEncoded); - + IoSenderManage.getPrivateKey("TMH_c3570480da8d", "1", "1", 1, 1); break; case 0x07: //无权限 diff --git a/star_lock/lib/blue/io_tool/cbc.dart b/star_lock/lib/blue/io_tool/cbc.dart index 372bd823..2e4e170d 100644 --- a/star_lock/lib/blue/io_tool/cbc.dart +++ b/star_lock/lib/blue/io_tool/cbc.dart @@ -34,3 +34,64 @@ class cbc{ 0xa3b1bac6, 0x56aa3350, 0x677d9197, 0xb27022dc ]; } + +/** + * ECB加密模式 + * @example encrypt_cbc("1234", "1234567890123456") => "woPrxebr8Xvyo1qG8QxAUA==" + * @param {any} plaintext 要加密的数据 + * @param {String} key + * @param {String} iv + * @param {String} mode base64 | "text" + * @returns {String} 加密后的字符串 + */ + +List encryptEcb (plaintext, key, keyIsStr, {mode = "base64"}) { + List list = []; +//let encryptRoundKeys = EncryptRoundKeys(stringToArray(key)); + var encryptRoundKeys; +// if (keyIsStr) { +// encryptRoundKeys = EncryptRoundKeys(stringToArray(key)); +// } else { +// encryptRoundKeys = EncryptRoundKeys(key); +// } +// let plainByteArray = plaintext; //stringToArray(plaintext); +// let padded = padding(plainByteArray); +// let blockTimes = padded.length / UINT8_BLOCK; +// let outArray = []; +// // CBC mode +// // init chain with iv (transform to uint32 block) +// for (let i = 0; i < blockTimes; i++) { +// // extract the 16 bytes block data for this round to encrypt +// let roundIndex = i * UINT8_BLOCK; +// let block = getChainBlock(padded, roundIndex); +// let cipherBlock = doBlockCrypt(block, encryptRoundKeys); +// for (let l = 0; l < UINT8_BLOCK; l++) { +// outArray[roundIndex + l] = +// cipherBlock[parseInt(l / 4)] >> ((3 - l) % 4 * 8) & 0xff; +// } +// } + return list; +} + +List EncryptRoundKeys(key) { + var keys = []; + var mk = [ + key[0] << 24 | key[1] << 16 | key[2] << 8 | key[3], + key[4] << 24 | key[5] << 16 | key[6] << 8 | key[7], + key[8] << 24 | key[9] << 16 | key[10] << 8 | key[11], + key[12] << 24 | key[13] << 16 | key[14] << 8 | key[15] + ]; + + // var k = List(36); + // k[0] = mk[0] ^ FK[0]; + // k[1] = mk[1] ^ FK[1]; + // k[2] = mk[2] ^ FK[2]; + // k[3] = mk[3] ^ FK[3]; + // + // for (int i = 0; i < 32; i++) { + // k[i + 4] = k[i] ^ tTransform2(k[i + 1] ^ k[i + 2] ^ k[i + 3] ^ CK[i]); + // keys[i] = k[i + 4]; + // } + + return keys; +} \ No newline at end of file diff --git a/star_lock/lib/blue/io_tool/io_tool.dart b/star_lock/lib/blue/io_tool/io_tool.dart index 628ba422..0ac32b6c 100644 --- a/star_lock/lib/blue/io_tool/io_tool.dart +++ b/star_lock/lib/blue/io_tool/io_tool.dart @@ -1,16 +1,17 @@ import 'dart:convert'; import 'dart:typed_data'; +import 'package:crypto/crypto.dart'; import 'package:flutter/services.dart'; -import 'package:encrypt/encrypt.dart'; +import 'package:encrypt/encrypt.dart' as ddd; - String getDNSAPIStr(Listdata, String key, String value) { - final key = Key.fromBase64('BwwfHxgKDwcXAxkWDwEHDBseIREPIA4QDxYOEBIDIRY='); - final iv = IV.fromBase64('FxIOBAcEEhISHgICCRYhEA=='); - final encrypter = Encrypter(AES(key, mode: AESMode.cbc, padding: "")); - final encrypted = encrypter.encrypt('hello world', iv: iv); +ddd.Encrypted getDNSAPIStr(Listdata, String key) { + // final key = Key.fromBase64('BwwfHxgKDwcXAxkWDwEHDBseIREPIA4QDxYOEBIDIRY='); + final iv = ddd.IV.fromLength(16); + final encrypter = ddd.Encrypter(ddd.AES(ddd.Key.fromUtf8(key), mode: ddd.AESMode.ecb, padding: 'Zero')); + final encrypted = encrypter.encrypt(key, iv: iv); - return encrypted.toString(); + return encrypted; } // static setDNSAPIStr(String value) { @@ -22,6 +23,12 @@ import 'package:encrypt/encrypt.dart'; // setCacheString(RKEnum.CACHE_STRING_APISTRURL, encrypt.base16); // } +String md5Crypto(List data){ + final dig = md5.convert(data); + var keyStr = dig.toString(); + return keyStr.substring(0, 16).toLowerCase(); +} + // 获取固定长度的数组 List getFixedLengthList(Listdata, int length) { for(int i = 0; i