#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
void enc_device_info(uint8_t *puParm1, uint8_t *pbParm2)
{
int iVar1;
uint32_t uVar2;
uint32_t uVar3;
uVar2 = (((((pbParm2[0] << 8) + pbParm2[1]) << 8) + pbParm2[2]) << 8) + pbParm2[3];
uVar3 = (((((pbParm2[4] << 8) + pbParm2[5]) << 8) + pbParm2[6]) << 8) + pbParm2[7];
iVar1 = 0;
do
{
iVar1 = iVar1 + 0x9E3779B9;
uVar2 = uVar2 + (((uVar3 * 0x10) + 0xB7FAE432) ^ (iVar1 + uVar3) ^ ((uVar3 >> 5) + 0x76B9DAF5));
uVar3 = uVar3 + (((uVar2 >> 5) + 0x659D0001) ^ (uVar2 * 0x10 + 0xAC540F39) ^ (uVar2 + iVar1));
} while (iVar1 != 0xC6EF3720);
*puParm1 = (char)(uVar2 >> 0x18);
puParm1[1] = (char)(uVar2 >> 0x10);
puParm1[2] = (char)(uVar2 >> 8);
puParm1[3] = (char)uVar2;
puParm1[4] = (char)(uVar3 >> 0x18);
puParm1[5] = (char)(uVar3 >> 0x10);
puParm1[6] = (char)(uVar3 >> 8);
puParm1[7] = (char)uVar3;
return;
}
/**
@brief 解密由 enc_device_info 加密的数据。
* * @param out 指向存放解密后明文的8字节缓冲区。
@param in 指向待解密的8字节密文。
*/
void dec_device_info(uint8_t *out, uint8_t *in)
{
uint32_t uVar2; // 数据块的前32位
uint32_t uVar3; // 数据块的后32位
uint32_t iVar1; // 轮密钥
// 1. 从输入密文中加载数据到两个32位变量 (大端模式)
uVar2 = ((uint32_t)in[0] << 24) | ((uint32_t)in[1] << 16) | ((uint32_t)in[2] << 8) | (uint32_t)in[3];
uVar3 = ((uint32_t)in[4] << 24) | ((uint32_t)in[5] << 16) | ((uint32_t)in[6] << 8) | (uint32_t)in[7];
// 2. 初始化轮密钥为加密过程的最终值
iVar1 = 0xC6EF3720;
// 3. 执行32轮逆向运算
for (int i = 0; i < 32; i++)
{
// 逆向更新 uVar3, 使用 enc_device_info 中 uVar3 更新的常量
uVar3 = uVar3 - (((uVar2 >> 5) + 0x659D0001) ^ ((uVar2 << 4) + 0xAC540F39) ^ (uVar2 + iVar1));
// 逆向更新 uVar2, 使用 enc_device_info 中 uVar2 更新的常量
uVar2 = uVar2 - (((uVar3 << 4) + 0xB7FAE432) ^ (iVar1 + uVar3) ^ ((uVar3 >> 5) + 0x76B9DAF5));
// 更新轮密钥到上一轮的值
iVar1 = iVar1 - 0x9E3779B9;
}
// 4. 将解密后的32位变量写回输出缓冲区 (大端模式)
out[0] = (uint8_t)(uVar2 >> 24);
out[1] = (uint8_t)(uVar2 >> 16);
out[2] = (uint8_t)(uVar2 >> 8);
out[3] = (uint8_t)uVar2;
out[4] = (uint8_t)(uVar3 >> 24);
out[5] = (uint8_t)(uVar3 >> 16);
out[6] = (uint8_t)(uVar3 >> 8);
out[7] = (uint8_t)uVar3;
}
void enc_device_data(uint8_t *puParm1, uint8_t *pbParm2)
{
int iVar1;
uint32_t uVar2;
uint32_t uVar3;
uVar2 = (((((pbParm2[0] << 8) + pbParm2[1]) << 8) + pbParm2[2]) << 8) + pbParm2[3];
uVar3 = (((((pbParm2[4] << 8) + pbParm2[5]) << 8) + pbParm2[6]) << 8) + pbParm2[7];
iVar1 = 0;
do
{
iVar1 = iVar1 + 0x9E3779B9;
uVar2 = uVar2 + (((uVar3 * 0x10) + 0x659D0001) ^ (iVar1 + uVar3) ^ ((uVar3 >> 5) + 0xAC540F39));
uVar3 = uVar3 + (((uVar2 >> 5) + 0xB7FAE432) ^ (uVar2 * 0x10 + 0x76B9DAF5) ^ (uVar2 + iVar1));
} while (iVar1 != 0xC6EF3720);
*puParm1 = (char)(uVar2 >> 0x18);
puParm1[1] = (char)(uVar2 >> 0x10);
puParm1[2] = (char)(uVar2 >> 8);
puParm1[3] = (char)uVar2;
puParm1[4] = (char)(uVar3 >> 0x18);
puParm1[5] = (char)(uVar3 >> 0x10);
puParm1[6] = (char)(uVar3 >> 8);
puParm1[7] = (char)uVar3;
return;
}
// 传入参数:out - 用于存放解密后明文的缓冲区(8字节), in - 待解密的密文(8字节)
void dec_device_data(uint8_t *out, uint8_t *in)
{
uint32_t uVar2; // 对应加密函数的 uVar2 (数据块的前32位)
uint32_t uVar3; // 对应加密函数的 uVar3 (数据块的后32位)
uint32_t iVar1; // 对应加密函数的 iVar1 (轮密钥)
// 1. 从输入密文中加载数据到两个32位变量 (大端模式)
uVar2 = ((uint32_t)in[0] << 24) | ((uint32_t)in[1] << 16) | ((uint32_t)in[2] << 8) | (uint32_t)in[3];
uVar3 = ((uint32_t)in[4] << 24) | ((uint32_t)in[5] << 16) | ((uint32_t)in[6] << 8) | (uint32_t)in[7];
// 2. 初始化轮密钥为加密过程的最终值
// 0xC6EF3720 = 32 * 0x9E3779B9
iVar1 = 0xC6EF3720;
// 3. 执行32轮逆向运算
// 使用 for 循环代替 do-while,逻辑更清晰
for (int i = 0; i < 32; i++)
{
// 逆向更新 uVar3
uVar3 = uVar3 - (((uVar2 >> 5) + 0xB7FAE432) ^ ((uVar2 << 4) + 0x76B9DAF5) ^ (uVar2 + iVar1));
// 逆向更新 uVar2
// 注意: 原加密代码中的 uVar3 * 0x10 等价于 uVar3 << 4
uVar2 = uVar2 - (((uVar3 << 4) + 0x659D0001) ^ (iVar1 + uVar3) ^ ((uVar3 >> 5) + 0xAC540F39));
// 更新轮密钥到上一轮的值
iVar1 = iVar1 - 0x9E3779B9;
}
// 4. 将解密后的32位变量写回输出缓冲区 (大端模式)
out[0] = (uint8_t)(uVar2 >> 24);
out[1] = (uint8_t)(uVar2 >> 16);
out[2] = (uint8_t)(uVar2 >> 8);
out[3] = (uint8_t)uVar2;
out[4] = (uint8_t)(uVar3 >> 24);
out[5] = (uint8_t)(uVar3 >> 16);
out[6] = (uint8_t)(uVar3 >> 8);
out[7] = (uint8_t)uVar3;
}
const uint8_t test_data[][8] = {
{0, 1, 2, 3, 4, 5, 6, 7},
{1, 2, 3, 4, 5, 6, 7, 8},
};
void app_main() {
printf("Hello, Wokwi!\n");
uint8_t tmp_buf[8];
for (int i = 0; i < sizeof(test_data) / sizeof(test_data[0]); i++)
{
printf("=======================\r\n");
printf("test data:");
for (int str_i = 0; str_i < 8; str_i++)
{
printf("%02x ", test_data[i][str_i]);
}
printf("\r\n");
enc_device_data(tmp_buf, (uint8_t *)&test_data[i]);
printf("enc data:");
for (int str_i = 0; str_i < 8; str_i++)
{
printf("%02x ", tmp_buf[str_i]);
}
printf("\r\n");
dec_device_data(tmp_buf, tmp_buf);
printf("dec data:");
for (int str_i = 0; str_i < 8; str_i++)
{
printf("%02x ", tmp_buf[str_i]);
}
printf("\r\n");
}
while (true) {
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}