实战分析某租房App实现一键解锁个人蓝牙门锁
private void parseDataListener() {
parseData(new OnUnLockResultListener() { // from class: com.kunshan.ble.lock.device.UnLockManager.1
// com.kunshan.ble.lock.device.UnLockManager.OnUnLockResultListener
public void onResult(String str) {
try {
String Decrypt = AESUtil.Decrypt(str, AppConstant.bleKey);
Log.d(UnLockManager.this.TAG, "tonyon: onResult: 获取开锁返回:" + Decrypt);
if (Decrypt.startsWith("02020100")) {
Log.d(UnLockManager.this.TAG, "tonyon: onResult: unlock success");
OnUnLockListener onUnLockListener = (OnUnLockListener) UnLockManager.listenerHashMap.get(1003);
if (onUnLockListener != null) {
onUnLockListener.unLockResultSuccess("开锁成功");
}
} else if (Decrypt.startsWith("02020101")) {
Log.d(UnLockManager.this.TAG, "tonyon: onResult: unlock fail");
OnUnLockListener onUnLockListener2 = (OnUnLockListener) UnLockManager.listenerHashMap.get(1003);
if (onUnLockListener2 != null) {
onUnLockListener2.onFail("开锁失败");
}
} else if (Decrypt.startsWith("01030101")) {
Log.d(UnLockManager.this.TAG, "tonyon: onResult: token error");
OnUnLockListener onUnLockListener3 = (OnUnLockListener) UnLockManager.listenerHashMap.get(1003);
if (onUnLockListener3 != null) {
onUnLockListener3.onFail("token无效");
}
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
});
}
String Decrypt = AESUtil.Decrypt(str, AppConstant.bleKey);
function Decrypt(){
let AESUtil = Java.use("com.kunshan.ble.lock.utils.AESUtil");
AESUtil["Decrypt"].implementation = function (str, str2) {
console.log(`AESUtil.Decrypt is called: str=${str}, str2=${str2}`);
let result = this["Decrypt"](str, str2);
console.log(`AESUtil.Decrypt result=${result}`);
return result;
};
}
function Encrypt(){
let AESUtil = Java.use("com.kunshan.ble.lock.utils.AESUtil");
AESUtil["Encrypt"].implementation = function (str, str2) {
console.log(`AESUtil.Encrypt is called: str=${str}, str2=${str2}`);
let result = this["Encrypt"](str, str2);
console.log(`AESUtil.Encrypt result=${result}`);
return result;
};
}
AESUtil.Encrypt is called: str=01010100000000000000000000000000, str2=9xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
AESUtil.Encrypt result=-65,-98,-28,50,11,114,-121,-69,-10,-13,69,55,108,-78,-91,-62
AESUtil.Decrypt is called: str=51e4ca8750e5fd0e52138deac4a0537c, str2=9xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
AESUtil.Decrypt result=01020469b0bff7000000000000000000
AESUtil.Encrypt is called: str=0201050169b0bff70000000000000000, str2=9xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
AESUtil.Encrypt result=-98,-30,103,-21,-35,-69,-57,-108,82,100,6,-78,-59,28,31,107
AESUtil.Decrypt is called: str=5e1f53a9ecdcd01b7c93bb4b83851535, str2=9xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
AESUtil.Decrypt result=02020100000000000000000000000000
function bytesToHexString(bytes) {
return Array.from(bytes, byte =>
byte.toString(16).padStart(2, '0')
).join('');
}
const bytes = new Uint8Array([-65,-98,-28,50,11,114,-121,-69,-10,-13,69,55,108,-78,-91,-62]);
const hexString = bytesToHexString(bytes);
console.log(hexString);
AESUtil.Encrypt is called: str=01010100000000000000000000000000, str2=9xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
AESUtil.Encrypt result=bf9ee4320b7287bbf6f345376cb2a5c2
AESUtil.Decrypt is called: str=51e4ca8750e5fd0e52138deac4a0537c, str2=90xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
AESUtil.Decrypt result=01020469b0bff7000000000000000000
AESUtil.Encrypt is called: str=0201050169b0bff70000000000000000, str2=9xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
AESUtil.Encrypt result=9ee267ebddbbc794526406b2c51c1f6b
AESUtil.Decrypt is called: str=5e1f53a9ecdcd01b7c93bb4b83851535, str2=9xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
AESUtil.Decrypt result=02020100000000000000000000000000
<!-- 与蓝牙设备配对 -->
<uses-permission android:name="android.permission.BLUETOOTH" />
<!-- 访问蓝牙设置 -->
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<!-- 向附近的蓝牙设备广播 -->
<uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
<!-- 连接到已配对的蓝牙设备 -->
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<!-- 发现附近的蓝牙设备并与其配对 -->
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
// 已知的信息
}
return hexString.toUpperCase();
}
// 辅助函数:将十六进制字符串转换为字节数组
function hexStringToByteArray(hexString) {
var bytes = new java.lang.reflect.Array.newInstance(java.lang.Byte.TYPE, hexString.length / 2);
for (var i = 0; i < hexString.length; i += 2) {
var byteValue = parseInt(hexString.substr(i, 2), 16);
if (byteValue > 127) {
byteValue -= 256; // 转换为Java字节的有符号表示
}
bytes[i / 2] = byteValue;
}
return bytes;
}
function hexStringToByteArray_t(hexString) {
var byteArray = [];
for (var i = 0; i < hexString.length; i += 2) {
var byte = parseInt(hexString.substr(i, 2), 16);
byteArray.push(byte);
}
return byteArray;
}
// 辅助函数:将字节数组转换为十六进制字符串
function bytesToHexString(byteArray) {
var hexString = '';
for (var i = 0; i < byteArray.length; i++) {
var hex = (byteArray[i] & 0xFF).toString(16);
if (hex.length == 1) {
hex = '0' + hex;
}
hexString += hex;
}
return hexString;
}
// 解密函数
function decrypt(encryptedHex, keyHex) {
//将代码中的AES解密代码转换为JS代码
}
// 加密函数
function encrypt(plaintextHexString, keyHexString) {
//将代码中的AES加密代码转换为JS代码
}
var gatt = device.connectGatt(context, false, gattCallback);
// 保持程序运行
var isRunning = true;
setTimeout(function() {
isRunning = false;
}, 10000); // 10秒后停止程序
while (isRunning) {
sleep(1000); // 每秒检查一次
}
没有评论