软件加密OK

This commit is contained in:
95384 2025-01-10 16:19:40 +08:00
parent b3d26b0969
commit 9273828134
8 changed files with 49 additions and 28 deletions

View File

@ -21,7 +21,7 @@
#define K_128 0xA12EE1FE
// 延时REV_MUTE_DELAY us启动ADC采集数据
// 最大风速30m/s 2.5M 采样率 延时260uS
#define REV_MUTE_DELAY_US 174

View File

@ -3,6 +3,10 @@
#include "comm_types.h"
#include "stm32l4xx_hal.h"
#include "inflash.h"
#include "anemometer_dev.h"
#include "frt_protocol.h"
#define K_64 0x9B45824A
uint8_t JudgeEncrypt();

View File

@ -140,6 +140,8 @@ typedef struct _FRT_RegProcTable_s{
void read_and_process_uart_data(device_handle uart_handle);
#pragma pack(pop)
extern uint32_t K_96;
#ifdef __cplusplus
}
#endif

View File

@ -31,6 +31,14 @@ typedef struct _usr_config_info{
u_int16_t uart_baud; /* 串口波特率 */
u_int16_t speed_average_time; /* 风速平均时间 */
u_int16_t temp_hum_update_time; /* 温湿度平均时间 */
u_int16_t temp0; /* 占位留待升级 */
u_int16_t temp1; /* 占位留待升级 */
u_int16_t temp2; /* 占位留待升级 */
u_int16_t temp3; /* 占位留待升级 */
u_int16_t temp4; /* 占位留待升级 */
u_int16_t temp5; /* 占位留待升级 */
u_int16_t temp6; /* 占位留待升级 */
u_int16_t temp7; /* 占位留待升级 */
u_int8_t flag_end;
}usr_config_info;
@ -57,6 +65,16 @@ typedef struct _factory_config_info{
u_int16_t linear_point_5_y; /* 线性插值点5Y */
u_int16_t linear_enable; /* 线性插值使能 */
u_int32_t encrypt_1; /* 后32位密文 */
u_int16_t temp0; /* 占位留待升级 */
u_int16_t temp1; /* 占位留待升级 */
u_int16_t temp2; /* 占位留待升级 */
u_int16_t temp3; /* 占位留待升级 */
u_int16_t temp4; /* 占位留待升级 */
u_int16_t temp5; /* 占位留待升级 */
u_int16_t temp6; /* 占位留待升级 */
u_int16_t temp7; /* 占位留待升级 */
u_int16_t temp8; /* 占位留待升级 */
u_int16_t temp9; /* 占位留待升级 */
u_int8_t flag_end;
}factory_config_info;
#pragma pack(pop)

View File

@ -8,6 +8,7 @@
#include "hp203b.h"
#include "FIR.h"
#include "LowPassFilter.h"
#include "encrypt.h"
#define AVE_TIME 600 //滑动平均时间最大600
#define COVER_TINE 10 //探头遮挡后导致的接收次数过小的报错临界次数
@ -461,6 +462,8 @@ char str[100];
void wind_task(void const * argument)
{
//软件加密校验
uint8_t wind_check_flag = JudgeEncrypt();
// 最大幅值
uint16_t wave_max_val1;
uint16_t wave_max_val2;
@ -478,6 +481,11 @@ void wind_task(void const * argument)
initLowPassFilter(&low_pass_filter_y, LOW_PASS_ALPHA);
for(;;)
{
if(!wind_check_flag)
{
osDelay(1000);
continue;
}
__HAL_TIM_DISABLE(&htim16);
// 采集X轴风速耗时 22ms两轴采集完44ms
__HAL_TIM_SET_COUNTER(&htim16,0);
@ -1052,10 +1060,13 @@ void my_update_mcs_param(float new_wind_speed, float new_wind_dirction)
win_10min.index = (win_10min.index + 1) % g_usrConfigInfo.speed_average_time;//更新索引
}
void tem_hum_update_task(void const * argument)
{
int time_s_temp_humi = 0;
uint32_t time_s_1Day = 0;
uint8_t tem_hun_check_flag = JudgeEncrypt();
uint16_t time_s_temp_humi = 0;//1秒计时温湿度更新
uint32_t time_s_1Day = 0;//1天的秒数
float backupTemperature;
@ -1080,6 +1091,7 @@ void tem_hum_update_task(void const * argument)
while(1)
{
osDelay(1000);
if(!tem_hun_check_flag)continue;
time_s_temp_humi ++;
time_s_1Day ++;
// 温湿度大气压更新

View File

@ -1,32 +1,11 @@
#include "encrypt.h"
/* TEA加密算法的加密过程 */
void tea_encrypt(uint32_t *en, uint32_t *k)
{
uint32_t v[2];
v[0] = *(uint32_t*)(0x1FFF7590);
v[1] = *(uint32_t*)(0x1FFF7590 + 4);
uint32_t v0 = v[0], v1 = v[1], sum = 0, i; // 初始化v0, v1, sum
uint32_t delta = 0x9e3779b9; // 初始化delta
uint32_t k0 = k[0], k1 = k[1], k2 = k[2], k3 = k[3]; // 初始化密钥k
for (i = 0; i < 32; i++) { // 执行32轮加密
sum += delta;
v0 += ((v1 << 4) + k0) ^ (v1 + sum) ^ ((v1 >> 5) + k1);
v1 += ((v0 << 4) + k2) ^ (v0 + sum) ^ ((v0 >> 5) + k3);
}
en[0] = v0; // 返回加密结果
en[1] = v1;
// term_printf("%x %x", v[0], v[1]);
}
/* TEA加密算法的解密过程 */
void tea_decrypt(uint32_t *v, uint32_t *k)
static void tea_decrypt(uint32_t *v, uint32_t *k)
{
uint32_t delta = 0x9e3779b9; // 初始化delta
// uint32_t v0 = 0x93ae5ba8, v1 = 0xc5ba4e82, sum = delta << 5, i; // 初始化v0, v1, sum
uint32_t v0 = g_stConfigInfo.encrypt_0, v1 = g_stConfigInfo.encrypt_1, sum = delta << 5, i; // 初始化v0, v1, sum
uint32_t k0 = k[0], k1 = k[1], k2 = k[2], k3 = k[3]; // 初始化密钥k
uint32_t k3 = k[3] ^ k[0], k2 = (k[2] ^ (*(uint32_t*)(0x1FFF7590))), k1 = k[1] ^ k[0], k0 = k[0] ^ (*(uint32_t*)(0x1FFF7590 + 4)); // 反算密钥
for(i = 0; i < 32; i++) { // 执行32轮解密
v1 -= ((v0 << 4) + k2) ^ (v0 + sum) ^ ((v0 >> 5) + k3);
v0 -= ((v1 << 4) + k0) ^ (v1 + sum) ^ ((v1 >> 5) + k1);
@ -45,7 +24,8 @@ void tea_decrypt(uint32_t *v, uint32_t *k)
uint8_t JudgeEncrypt()
{
uint32_t encryptCode[2] = {0};
uint32_t key[] = {0x509770ff, 0x29c6b369, 0x4da2c125, 0x7d729015}; //密钥可能要打散位置,不在这里定死
// uint32_t key[] = {0x509770ff, 0x29c6b369, 0x4da2c125, ID中间32位}; //
uint32_t key[] = {(K_128 >> 1) ^ (*(uint32_t*)(0x1FFF7590 + 4)), (K_96 >> 2) ^ key[0], (K_64 >>1) ^ (*(uint32_t*)(0x1FFF7590)), (*(uint32_t*)(0x1FFF7590 + 4)) ^ key[0]};
tea_decrypt(encryptCode, key);
return ((*(uint32_t*)(0x1FFF7590)) == encryptCode[0] && (*(uint32_t*)(0x1FFF7590 + 4)) == encryptCode[1]);
}
}

View File

@ -1536,6 +1536,7 @@ void FRT_MsgHandler(device_handle device, u_int8_t *pMsg, u_int32_t MsgLen)
* @param
* @retval
*/
uint32_t K_96 = 0xA71ACDA4;
static u_int8_t rs485_buff[50]={0x00};
void read_and_process_uart_data(device_handle device)
{

View File

@ -192,10 +192,14 @@ void LEDTask(void const * argument)
{
/* USER CODE BEGIN StartDefaultTask */
/* Infinite loop */
uint8_t LED_Check_flag = JudgeEncrypt();
for(;;)
{
osDelay(1000);
if(LED_Check_flag)
{
HAL_GPIO_TogglePin(GPIOC,GPIO_LED_CTRL_Pin);
}
}
/* USER CODE END StartDefaultTask */
}