通用轻量级密码/鉴权/ 秘钥算法(C语言)

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 ********************************/
相关推荐
runnerdancer6 小时前
LLM是怎么处理messages数组的,提示词缓存又是什么
前端·agent
陈随易6 小时前
VSCode的Copilot扩展支持接入DeepSeek,Kimi了!
前端·后端·程序员
我不是外星人8 小时前
有了 Harness Engineering ,真的还需要研发工程师吗?
前端·后端·ai编程
IT_陈寒10 小时前
JavaScript的闭包把我坑惨了,说好的内存会自动回收呢?
前端·人工智能·后端
Jackson__11 小时前
分享一个横向滚动案例,带悬停暂停,通用性很强
前端
MariaH12 小时前
git rebase的使用
前端
_柳青杨12 小时前
深入理解 JavaScript 事件循环
前端·javascript
阡陌Jony12 小时前
关于前端性能优化的一些问题:
前端
用户6000718191013 小时前
【翻译】简化 TSRX
前端
IT乐手14 小时前
佛德角逼平西班牙,国足还有啥借口?
前端