using System;
using UnityEngine;
public class BluetoothDecryptor
{
// 授权标志
private static bool _authorizationFlg = false;
// 密钥长度
private const int KEY_LENGTH = 12;
// 对称密钥
private static readonly byte[] c_abySecretKey = System.Text.Encoding.ASCII.GetBytes("qingfengluan");
private static readonly byte[] _decryptExpected = new byte[4];
private static readonly byte[] _encryptExpected = new byte[4];
/***********************************************************
*@函 数 名 : AUTHOR_ImprovedEncrypt
*@功能说明 : 加密函数
*@形 参 : pbyData - 待加密字符串
*@ dwDataLen - 加密数据长度
*@返 回 值 : void
*@作 者 : Shaoxin Wu
*@日 期 : 2024-06-24
***********************************************************/
private static void AUTHOR_ImprovedEncrypt(byte[] data, int offset, int length)
{
for (int i = offset; i < offset + length; i++)
{
for (int j = 0; j < KEY_LENGTH; j++)
{
data[i] ^= c_abySecretKey[j]; // 多轮异或
data[i] = (byte)((data[i] << 1) | (data[i] >> 7)); // 左循环移位
}
}
}
/***********************************************************
*@函 数 名 : AUTHOR_ImprovedDecrypt
*@功能说明 : 解密函数
*@形 参 : pbyData - 待解密字符串
*@ dwDataLen - 解密数据长度
*@返 回 值 : pbyData - 解密后的数据
*@作 者 : Shaoxin Wu
*@日 期 : 2024-06-24
***********************************************************/
public static byte[] AUTHOR_ImprovedDecrypt(byte[] pbyData, uint dwDataLen)
{
for (uint i = 0; i < dwDataLen; i++)
{
for (int j = KEY_LENGTH - 1; j >= 0; j--)
{
pbyData[i] = (byte)((pbyData[i] >> 1) | (pbyData[i] << 7)); // 右循环移位
pbyData[i] ^= c_abySecretKey[j]; // 多轮异或
}
}
return pbyData;
}
/***********************************************************
*@函 数 名 : CheckSum
*@功能说明 : 累加和校验计算
*@形 参 : pbyData - 数据地址
*@ byDataLen - 校验数据长度
*@返 回 值 : 校验和结果
*@作 者 : Shaoxin Wu
*@日 期 : 2024-06-24
***********************************************************/
public static byte CheckSum(byte[] pbyData, byte byDataLen)
{
byte byRet = 0;
for (byte i = 0; i < byDataLen; i++)
{
byRet += pbyData[i];
}
return byRet;
}
///
/// 最前面插入一个字节
///
///
///
///
public static byte[] InsertByteAtBeginning(byte[] originalArray, byte newByte)
{
byte[] newArray = new byte[originalArray.Length + 1];
newArray[0] = newByte;
Array.Copy(originalArray, 0, newArray, 1, originalArray.Length);
return newArray;
}
public static byte[] GetResponse(byte[] bytes) {
//byte[] dataToDecrypt = { 0x5A, 0x76, 0xD1, 0x02, 0xEB, 0x8E, 0x5D };
//需要解密的4个数据
byte[] encryptedData = new byte[] { bytes[1], bytes[2], bytes[3], bytes[4] };
uint dataLength = (uint)encryptedData.Length;
byte checksumStart = CheckSum(new byte[] { bytes[0] , bytes[1], bytes[2], bytes[3], bytes[4] }, 5);
// 打印开始校验和
//Debug.Log("checksumStart: " + checksumStart + ",对应16进制=" + checksumStart.ToString("X"));
// 打印原始加密数据
Debug.Log("Original Data: " + System.BitConverter.ToString(bytes));
//Debug.Log("Original Encrypted Data: " + System.BitConverter.ToString(encryptedData));
// 解密数据
byte[] decryptedData = AUTHOR_ImprovedDecrypt(encryptedData, dataLength);
// 打印解密后的数据
//Debug.Log("Decrypted Data: " + System.BitConverter.ToString(decryptedData));
byte[] newArray = InsertByteAtBeginning(decryptedData, bytes[0]);
//Debug.Log("前插 {0x5A} 后: " + System.BitConverter.ToString(newArray));
// 计算累加和校验
byte checksum = CheckSum(newArray, (byte)newArray.Length);
// Debug.Log("checksum:" + checksum + ", 对应16进制:"+ checksum.ToString("X"));
//byte checksum = Decryptor.CheckSum(decryptedData, (byte)dataLength);
//// 打印校验和
//Debug.Log("Checksum: " + checksum+",16=" + checksum.ToString("X"));
// 组装应答数据
byte[] responseData = new byte[7];
responseData[0] = 0x5A; // 起始码
System.Array.Copy(decryptedData, 0, responseData, 1, decryptedData.Length); // 解密数据
responseData[5] = checksum; // 累加和校验
responseData[6] = 0x5D; // 结束码
// 将应答数据转换为字符串
Debug.Log("Original Response Data: " + System.BitConverter.ToString(responseData));
// string responseString = System.BitConverter.ToString(responseData).Replace("-", "");
//Debug.Log("Response Data: " + responseString);
return responseData;
}
/***********************************************************
*@函 数 名 : AUTHOR_GenerateRandomData
*@功能说明 : 生成随机数据函数
*@形 参 : dwSeed - 种子值
*@ pbyData - 存放随机数据的数组
*@ dwDataLen - 随机数据长度
*@返 回 值 : void
*@作 者 : Shaoxin Wu
*@日 期 : 2024-06-24
***********************************************************/
private static void AUTHOR_GenerateRandomData(uint dwSeed, byte[] data, int offset, int length)
{
for (int i = 0; i < length; i++)
{
data[offset + i] = (byte)(dwSeed & 0xFF); // 简单地取低8位作为随机数据
dwSeed >>= 1; // 移位
}
}
/***********************************************************
*@函 数 名 : AUTHOR_IsDecrypt
*@功能说明 : 获取授权状态
*@形 参 : void
*@返 回 值 : void
*@作 者 : Shaoxin Wu
*@日 期 : 2024-07-28
***********************************************************/
public static bool AUTHOR_IsDecrypt()
{
return _authorizationFlg;
}
/***********************************************************
*@函 数 名 : AUTHOR_Decrypt
*@功能说明 : 解析授权响应数据
*@形 参 : void
*@返 回 值 : void
*@作 者 : Shaoxin Wu
*@日 期 : 2024-07-28
***********************************************************/
public static void AUTHOR_Decrypt(byte[] pbyData)
{
byte byCheckSum = CheckSum(pbyData, 5);
if (byCheckSum == pbyData[5])
{
Array.Copy(pbyData, 1, _encryptExpected, 0, 4);
if (BitConverter.ToUInt32(pbyData, 1) == BitConverter.ToUInt32(_decryptExpected, 0))
{
_authorizationFlg = true;
}
}
}
/***********************************************************
*@函 数 名 : AUTHOR_Encryption
*@功能说明 : 取消授权
*@形 参 : void
*@返 回 值 : void
*@作 者 : Shaoxin Wu
*@日 期 : 2024-07-28
***********************************************************/
public static void AUTHOR_Encryption()
{
_authorizationFlg = false;
}
/***********************************************************
*@函 数 名 : AUTHOR_SendReq
*@功能说明 : 输入系统Tick,生成随机值并加密
*@形 参 : void
*@返 回 值 : void
*@作 者 : Shaoxin Wu
*@日 期 : 2024-07-28
***********************************************************/
public static byte[] AUTHOR_SendReq(uint dwTick)
{
byte[] abySendData = new byte[7];
abySendData[0] = 0x5A;
// 根据种子生成随机值
AUTHOR_GenerateRandomData(dwTick, abySendData, 1, 4);
Array.Copy(abySendData, 1, _decryptExpected, 0, 4);
// 加密数据
AUTHOR_ImprovedEncrypt(abySendData, 1, 4);
abySendData[5] = CheckSum(abySendData, 5);
abySendData[6] = 0x5D;
return abySendData;
}
//// 模拟发送数据
//private static void SPP_DataNotify(byte[] data)
//{
// // 实际发送数据的实现
// Console.WriteLine(BitConverter.ToString(data));
//}
}