软件加密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采集数据 // 延时REV_MUTE_DELAY us启动ADC采集数据
// 最大风速30m/s 2.5M 采样率 延时260uS // 最大风速30m/s 2.5M 采样率 延时260uS
#define REV_MUTE_DELAY_US 174 #define REV_MUTE_DELAY_US 174

View File

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

View File

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

View File

@ -31,6 +31,14 @@ typedef struct _usr_config_info{
u_int16_t uart_baud; /* 串口波特率 */ u_int16_t uart_baud; /* 串口波特率 */
u_int16_t speed_average_time; /* 风速平均时间 */ u_int16_t speed_average_time; /* 风速平均时间 */
u_int16_t temp_hum_update_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; u_int8_t flag_end;
}usr_config_info; }usr_config_info;
@ -57,6 +65,16 @@ typedef struct _factory_config_info{
u_int16_t linear_point_5_y; /* 线性插值点5Y */ u_int16_t linear_point_5_y; /* 线性插值点5Y */
u_int16_t linear_enable; /* 线性插值使能 */ u_int16_t linear_enable; /* 线性插值使能 */
u_int32_t encrypt_1; /* 后32位密文 */ 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; u_int8_t flag_end;
}factory_config_info; }factory_config_info;
#pragma pack(pop) #pragma pack(pop)

View File

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

View File

@ -1,32 +1,11 @@
#include "encrypt.h" #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加密算法的解密过程 */ /* 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 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 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轮解密 for(i = 0; i < 32; i++) { // 执行32轮解密
v1 -= ((v0 << 4) + k2) ^ (v0 + sum) ^ ((v0 >> 5) + k3); v1 -= ((v0 << 4) + k2) ^ (v0 + sum) ^ ((v0 >> 5) + k3);
v0 -= ((v1 << 4) + k0) ^ (v1 + sum) ^ ((v1 >> 5) + k1); 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() uint8_t JudgeEncrypt()
{ {
uint32_t encryptCode[2] = {0}; 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); tea_decrypt(encryptCode, key);
return ((*(uint32_t*)(0x1FFF7590)) == encryptCode[0] && (*(uint32_t*)(0x1FFF7590 + 4)) == encryptCode[1]); 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 * @param
* @retval * @retval
*/ */
uint32_t K_96 = 0xA71ACDA4;
static u_int8_t rs485_buff[50]={0x00}; static u_int8_t rs485_buff[50]={0x00};
void read_and_process_uart_data(device_handle device) void read_and_process_uart_data(device_handle device)
{ {

View File

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