crypto.h
cpp
/** @copyright Copyright (c) 2025 Craftsman In Jianghu. All rights reserved.
******************************************************************************
* @file crypto.h
* @brief 通用轻量级密码/鉴权算法库 头文件
* @details 包含XorShift32、S盒非线性、Feistel网络轻量级算法
* 适用于车载/工控/物联网等全MCU平台,无硬件依赖,编译器自动裁剪未使用函数
*
* @author 匠在江湖(0001)
* @version V01.00
* @date 2025-05-08
******************************************************************************
* @attention
*
* @par 修改日志:
* | 版本 | 日期 | 作者(ID) | 说明 |
* |--------|------------|-----------------|----------|
* | V01.00 | 2025-05-08 | 匠在江湖(0001) | 创建初版 |
******************************************************************************
*/
#ifndef CRYPTO_H_
#define CRYPTO_H_
/* Includes *******************************************************************/
#include <stdint.h>
#ifdef __cplusplus
extern "C"{
#endif
/* Exported types *************************************************************/
typedef uint16_t SEED_T; // 种子数据类型
typedef uint16_t CODE_T; // 校验/授权码类型
typedef uint32_t OUT_T; // 算法输出结果类型
/* Exported constants *********************************************************/
/* Exported macro *************************************************************/
/* Exported functions *********************************************************/
/**
* @brief XorShift32伪随机数扰动算法
* @param seed: 输入随机种子
* @param code: 输入校验/授权码
* @return 算法计算结果
*/
extern OUT_T XorShift32Crypto(SEED_T seed, CODE_T code);
/**
* @brief S盒查表+非线性变换算法
* @param seed: 输入随机种子
* @param code: 输入校验/授权码
* @return 算法计算结果
*/
extern OUT_T SBoxCrypto(SEED_T seed, CODE_T code);
/**
* @brief 自定义Feistel分组网络算法
* @param seed: 输入随机种子
* @param code: 输入校验/授权码
* @return 算法计算结果
*/
extern OUT_T FeistelCrypto(SEED_T seed, CODE_T code);
#ifdef __cplusplus
}
#endif
#endif /* CRYPTO_H_ */
/********************************* END OF FILE ********************************/
crypto.c
cpp
/** @copyright Copyright (c) 2025 Craftsman In Jianghu. All rights reserved.
******************************************************************************
* @file crypto.c
* @brief 通用轻量级密码/鉴权算法库 源文件
* @details 纯C实现,体积极小,无硬件依赖,适配全平台MCU
*
* @author 匠在江湖(0001)
* @version V01.00
* @date 2025-05-08
******************************************************************************
* @attention
*
* @par 修改日志:
* | 版本 | 日期 | 作者(ID) | 说明 |
* |--------|------------|-----------------|----------|
* | V01.00 | 2025-05-08 | 匠在江湖(0001) | 创建初版 |
******************************************************************************
*/
/* Includes *******************************************************************/
#include "crypto.h"
/* Private typedef ************************************************************/
/* Private constants **********************************************************/
// S盒非线性替换表(可自定义修改数值,提高安全性)
#define SBOX_SIZE 16U
static const uint8_t sBox[SBOX_SIZE] = {
0x03, 0x0E, 0x07, 0x0C, 0x0D, 0x0A, 0x08, 0x0F,
0x00, 0x02, 0x0B, 0x05, 0x09, 0x01, 0x06, 0x04
};
/* Private macro **************************************************************/
/* Private variables **********************************************************/
/* Private function prototypes ************************************************/
/**
******************************************************************************
* @brief XorShift32伪随机数扰动算法
* @param seed: 输入随机种子
* @param code: 输入校验/授权码
* @return 算法计算结果
* @note 标准伪随机算法,随机性优异
******************************************************************************
*/
OUT_T XorShift32Crypto(SEED_T seed, CODE_T code)
{
uint32_t val = seed;
// XorShift32核心扰动运算
val ^= val << 13U;
val ^= val >> 17U;
val ^= val << 5U;
// 与授权码异或输出
val ^= code;
return val;
}
/**
******************************************************************************
* @brief S盒查表+非线性变换算法
* @param seed: 输入随机种子
* @param code: 输入校验/授权码
* @return 算法计算结果
* @note 非线性替换+位扩散,量产通用首选
******************************************************************************
*/
OUT_T SBoxCrypto(SEED_T seed, CODE_T code)
{
uint16_t temp;
// 种子按4位分段,进行S盒非线性替换
temp = (uint16_t)sBox[seed & 0x0F] << 12U;
temp |= (uint16_t)sBox[(seed >> 4U) & 0x0F] << 8U;
temp |= (uint16_t)sBox[(seed >> 8U) & 0x0F] << 4U;
temp |= (uint16_t)sBox[(seed >> 12U) & 0x0F];
// 位运算扩散,提高混淆度
temp ^= (temp << 5U) ^ (temp >> 3U);
// 与授权码异或
temp ^= code;
return (OUT_T)temp;
}
/**
******************************************************************************
* @brief 自定义Feistel分组网络算法
* @param seed: 输入随机种子
* @param code: 输入校验/授权码
* @return 算法计算结果
* @note 轻量级分组密码结构,安全性较高
******************************************************************************
*/
OUT_T FeistelCrypto(SEED_T seed, CODE_T code)
{
// 将16位种子分为高低8位两组
uint8_t left = (uint8_t)(seed >> 8U);
uint8_t right = (uint8_t)(seed & 0xFFU);
uint8_t temp;
const uint8_t rounds = 2U; // 轻量级加密轮数
// Feistel两轮加密运算
for (uint8_t i = 0U; i < rounds; i++)
{
// 轮函数:非线性运算
temp = (uint8_t)((right * 3U + code) ^ 0x1AU);
left ^= temp;
// 左右分组数据交换
temp = left;
left = right;
right = temp;
}
// 合并分组结果输出
return (OUT_T)((left << 8U) | right);
}
/********************************* END OF FILE ********************************/