From 83daf04a1193042b81d32d02c87efb102b8a274d 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 18:56:29 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9SM4=E5=8A=A0=E5=AF=86?= =?UTF-8?q?=E7=AE=97=E6=B3=95?= 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 | 45 ++++++++-- .../lib/blue/io_protocol/io_getPublicKey.dart | 12 +++ star_lock/lib/blue/io_protocol/io_sender.dart | 27 ++---- star_lock/lib/blue/io_tool/cbc.dart | 2 +- star_lock/lib/blue/io_tool/io_tool.dart | 84 +++++-------------- star_lock/lib/blue/sender_data.dart | 1 - .../addLock/nearbyLock/nearbyLock_logic.dart | 2 +- star_lock/pubspec.yaml | 1 + 9 files changed, 82 insertions(+), 96 deletions(-) diff --git a/star_lock/lib/blue/blue_manage.dart b/star_lock/lib/blue/blue_manage.dart index 2be277ab..d1b76427 100644 --- a/star_lock/lib/blue/blue_manage.dart +++ b/star_lock/lib/blue/blue_manage.dart @@ -42,7 +42,7 @@ class BlueManage{ if(device.name.isEmpty){ return; } - + // print("startScanDevice:${device}"); if (((device.serviceUuids.isNotEmpty ? device.serviceUuids[0] : "").toString().contains("758824")) && (device.rssi >= -100)) { // print("11111111111111111:${device}"); final knownDeviceIndex = _scanDevices.indexWhere((d) => d.id == device.id); @@ -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 hexStr:${radixString(value)}'); + // print('Write with characteristicId:${characteristic.characteristicId} serviceId:${characteristic.serviceId} deviceId:${characteristic.deviceId} value : $value hexStr:${radixString(value)}'); try { List valueList = value; diff --git a/star_lock/lib/blue/io_protocol/io_getPrivateKey.dart b/star_lock/lib/blue/io_protocol/io_getPrivateKey.dart index 1e4dd1fb..15691ef5 100644 --- a/star_lock/lib/blue/io_protocol/io_getPrivateKey.dart +++ b/star_lock/lib/blue/io_protocol/io_getPrivateKey.dart @@ -8,6 +8,8 @@ import 'io_sender.dart'; import 'io_type.dart'; import 'package:crypto/crypto.dart' as a; +import 'package:convert/convert.dart'; +import 'package:sm_crypto/sm_crypto.dart'; class GetPrivateKeyCommand extends SenderProtocol { @@ -30,6 +32,17 @@ class GetPrivateKeyCommand extends SenderProtocol { List ebcData = []; print("lockID:${lockID!} lockID.utf8.encode${utf8.encode(lockID!)}"); + // 指令类型 + int type = commandType!.typeValue; + double typeDouble = type/256; + int type1 = typeDouble.toInt(); + int type2 = type%256; + data.add(type1); + data.add(type2); + print("type:$type"); + print("type1:$type1"); + print("type2:$type2"); + // 锁id int lockIDLength = utf8.encode(lockID!).length; data.addAll(utf8.encode(lockID!)); @@ -59,6 +72,12 @@ class GetPrivateKeyCommand extends SenderProtocol { }else{ List authCodeData = []; + //KeyID + // authCodeData.addAll(utf8.encode(keyID!)); + // + // //authUserID + // authCodeData.addAll(utf8.encode(authUserID!)); + //KeyID authCodeData.addAll(utf8.encode(keyID!)); @@ -74,22 +93,30 @@ class GetPrivateKeyCommand extends SenderProtocol { authCodeData.add((d1 & 0xff00) >> 8); authCodeData.add((d1 & 0xff)); - var pubKey = Storage.getData("bluePublicKey"); - List pubKeyData = utf8.encode(pubKey.toString()); + // var pubKey = Storage.getData("bluePublicKey"); + var pubKey = "ovOvAHuL5+dBCw7L3Qt7IQ=="; + List pubKeyData = base64.decode(pubKey); authCodeData.addAll(pubKeyData); - // var stringEncoded = md5Crypto(authCodeData); - // data.add(stringEncoded.length); - + // 把KeyID、authUserID、时间戳、公钥通过md5加密之后就是authCode var authCode = a.md5.convert(authCodeData); - print("authCodeData:$authCodeData authCode:$authCode"); + print("authCodeData:$authCodeData \nauthCode:$authCode \nauthCodeBytes:${authCode.bytes}"); data.add(authCode.bytes.length); data.addAll(authCode.bytes); - - print("authCode:$authCode authCode.bytes.length:${authCode.bytes.length} data:$data ebcData$ebcData"); } - ebcData = getDNSAPIStr(data, "TMH_c3570480da8d").bytes; + + if((data.length % 16) != 0){ + int add = (16 - data.length % 16); + for(int i = 0; i messageDetail() { List data = []; + + // 指令类型 + int type = commandType!.typeValue; + double typeDouble = type/256; + int type1 = typeDouble.toInt(); + int type2 = type%256; + data.add(type1); + data.add(type2); + print("type:$type"); + print("type1:$type1"); + print("type2:$type2"); + print("lockID:${lockID!} lockID.utf8.encode${utf8.encode(lockID!)}"); int length = utf8.encode(lockID!).length; data.addAll(utf8.encode(lockID!)); diff --git a/star_lock/lib/blue/io_protocol/io_sender.dart b/star_lock/lib/blue/io_protocol/io_sender.dart index e28adf52..b3b050be 100644 --- a/star_lock/lib/blue/io_protocol/io_sender.dart +++ b/star_lock/lib/blue/io_protocol/io_sender.dart @@ -31,11 +31,11 @@ abstract class SenderProtocol extends IOData { // 帧头 commandList.addAll(header); - print("header:$header"); + // print("header:$header"); //包类型 commandList.add(ask); //包类型 - print("ask:$ask"); + // print("ask:$ask"); // 包序号 int commandIndexChange = _commandIndex!; @@ -44,11 +44,11 @@ abstract class SenderProtocol extends IOData { int commandIndexChang2 = commandIndexChange%256; commandList.add(commandIndexChang1); commandList.add(commandIndexChang2); - print("_commandIndex:$_commandIndex commandIndexChang1$commandIndexChang1 commandIndexChang2:$commandIndexChang2"); + // print("_commandIndex:$_commandIndex commandIndexChang1$commandIndexChang1 commandIndexChang2:$commandIndexChang2"); // 包标识 commandList.add(identifier); - print("identifier:$identifier"); + // print("identifier:$identifier"); // 数据长度 // int dataLength = dataSourceLength(); @@ -61,20 +61,9 @@ abstract class SenderProtocol extends IOData { commandList.add(dataLength.toInt()); commandList.add(42%256); - // 指令类型 - int type = commandType!.typeValue; - double typeDouble = type/256; - int type1 = typeDouble.toInt(); - int type2 = type%256; - commandList.add(type1); - commandList.add(type2); - print("type:$type"); - print("type1:$type1"); - print("type2:$type2"); - // 数据块 commandList.addAll(commandData!); //数据块 - print("commandData:$commandData"); + // print("commandData:$commandData"); // 校验位 var mcrc = crc_16(commandList); @@ -83,9 +72,9 @@ abstract class SenderProtocol extends IOData { int mcrcDouble2 = mcrc%256; commandList.add(mcrcDouble1); //帧尾 commandList.add(mcrcDouble2); - print("mcrc:$mcrc"); - print("mcrcDouble1:$mcrcDouble1"); - print("mcrcDouble2:$mcrcDouble2"); + // print("mcrc:$mcrc"); + // print("mcrcDouble1:$mcrcDouble1"); + // print("mcrcDouble2:$mcrcDouble2"); return commandList; } diff --git a/star_lock/lib/blue/io_tool/cbc.dart b/star_lock/lib/blue/io_tool/cbc.dart index 2e4e170d..b9c685c2 100644 --- a/star_lock/lib/blue/io_tool/cbc.dart +++ b/star_lock/lib/blue/io_tool/cbc.dart @@ -94,4 +94,4 @@ List EncryptRoundKeys(key) { // } 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 0ac32b6c..63ab1364 100644 --- a/star_lock/lib/blue/io_tool/io_tool.dart +++ b/star_lock/lib/blue/io_tool/io_tool.dart @@ -4,25 +4,29 @@ import 'dart:typed_data'; import 'package:crypto/crypto.dart'; import 'package:flutter/services.dart'; import 'package:encrypt/encrypt.dart' as ddd; +import 'package:sm_crypto/sm_crypto.dart'; -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); +String getSM4Str(Listdata, String key) { + String dataStr = radixString(data); + String iv = SM4.createHexKey(key: key); - return encrypted; + String cbcEncryptData = SM4.encrypt( + data: dataStr, + key: iv, + mode: SM4CryptoMode.ECB, + iv: iv, + ); + + print("getDNSAPIStrData:$data \ngetDNSAPIStrkey:$key \ngetDNSAPIStrDataStr:$dataStr \niv:$iv\ncbcEncryptData:$cbcEncryptData"); + return cbcEncryptData; + + // final iv = ddd.IV.fromLength(32); + // final encrypter = ddd.Encrypter(ddd.AES(ddd.Key.fromUtf8(key), mode: ddd.AESMode.ecb, padding: 'PKCS7')); + // final encrypted = encrypter.encrypt(key, iv: iv); + // + // return encrypted; } -// static setDNSAPIStr(String value) { -// final key = Key.fromUtf8(RKNetworkManager().mSeeSkyLocalPrivateKey); -// final iv = IV.fromUtf8(RKNetworkManager().mSeeSkyLocalPrivateKey); -// final encrypter = Encrypter(AES(key, mode: AESMode.cbc, padding: "PKCS7")); -// final encrypt = encrypter.encrypt(value, iv: iv); -// -// setCacheString(RKEnum.CACHE_STRING_APISTRURL, encrypt.base16); -// } - String md5Crypto(List data){ final dig = md5.convert(data); var keyStr = dig.toString(); @@ -40,9 +44,9 @@ List getFixedLengthList(Listdata, int length) { //int ---> 指定长度的hex (如指定长度为6的情况,0x000001 0x001234, 0xefab23) String intToFormatHex(int num, int length) { String hexString = num.toRadixString(16); - print("hexString=$hexString"); + // print("hexString=$hexString"); String formatString = hexString.padLeft(length, "0"); - print("formatHexString=$formatString"); + // print("formatHexString=$formatString"); return formatString; } @@ -214,52 +218,6 @@ List> splitList(List list, int len) { return result; } -//TODO:获取数据包分包后包的数量 -// int getPackageCount(List data, {required int averageLen}) { -// int len = data.length; -// return len % averageLen > 0 ? (len ~/ averageLen + 1) : len ~/ averageLen; -// } -// -// List getSubData( -// {required int index, required int average, required List data}) { -// if (data.isEmpty) { -// return []; -// } -// int totalLength = data.length; -// if (average >= totalLength) { -// return data; -// } -// -// if (index * average > totalLength) { -// if ((index - 1) * average > totalLength) { -// return []; -// } else { -// int tempCount = average * (index - 1); -// return data.sublist(tempCount, totalLength); -// } -// } else { -// return data.sublist(average * (index - 1), average * index); -// } -// } - -// List reverseList(List srcData) { -// print('srcData:$srcData'); //[1,3] -// int srcLen = srcData.length; -// int halfLen = srcLen ~/ 2; -// List dstData = []; -// dstData.addAll(srcData); -// for (int i = 0; i < halfLen; i++) { -// int begin = i; -// int end = srcLen - i - 1; -// List beginData = srcData.sublist(begin, begin + 1); -// List endData = srcData.sublist(end, end + 1); -// dstData.replaceRange(begin, begin + 1, endData); -// dstData.replaceRange(end, end + 1, beginData); -// } -// print('dstData:$dstData'); -// return dstData; -// } - //TODO:int->两个字节 List 高字节在前,低字节在后(小端存储) 本工程只有配置 WiFi用到的!!!! List intToByte2ListLow(int value) => [value >> 8, value]; diff --git a/star_lock/lib/blue/sender_data.dart b/star_lock/lib/blue/sender_data.dart index a1e670cd..33e9bffc 100644 --- a/star_lock/lib/blue/sender_data.dart +++ b/star_lock/lib/blue/sender_data.dart @@ -44,7 +44,6 @@ class CommandSenderManager { } void _sendNormalData(List data) async { - print("lllllll:${data}"); if (data.isNotEmpty) { EventBusManager().eventBusFir(EventSendModel(data: data, sendChannel: DataChannel.ble)); } diff --git a/star_lock/lib/mine/addLock/nearbyLock/nearbyLock_logic.dart b/star_lock/lib/mine/addLock/nearbyLock/nearbyLock_logic.dart index be321ac1..a2387f95 100644 --- a/star_lock/lib/mine/addLock/nearbyLock/nearbyLock_logic.dart +++ b/star_lock/lib/mine/addLock/nearbyLock/nearbyLock_logic.dart @@ -47,7 +47,7 @@ class NearbyLockLogic extends BaseGetXController{ _sendStreamSubscription = EventBusManager().eventBus!.on().listen(( EventSendModel model) { if (model.sendChannel == DataChannel.ble) { - print("fsdfgsdfgsdfgsdfgsdfgsdfg:${BlueManage().qualifiedCharacteristic}"); + // print("fsdfgsdfgsdfgsdfgsdfgsdfg:${BlueManage().qualifiedCharacteristic}"); BlueManage().writeCharacteristicWithResponse(QualifiedCharacteristic( deviceId:BlueManage().qualifiedCharacteristic!.deviceId, characteristicId: BlueManage().qualifiedCharacteristic!.characteristicId, diff --git a/star_lock/pubspec.yaml b/star_lock/pubspec.yaml index 8da6a97d..6380d7ae 100644 --- a/star_lock/pubspec.yaml +++ b/star_lock/pubspec.yaml @@ -87,6 +87,7 @@ dependencies: #加密解密 encrypt: ^5.0.1 crypto: ^3.0.3 + sm_crypto: ^1.0.3 dev_dependencies: flutter_test: