通用轻量级密码/鉴权/ 秘钥算法(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 ********************************/
相关推荐
郭老二30 分钟前
【前端】vue3:编译步骤
前端
不在逃避q1 小时前
Trae/Vs Code/Cursor命令行无法跑npm命令
前端·arcgis·npm
夏殇之殁2 小时前
包中创建自定义列表项。 . 使用自定义列表项进行数据绑定 . 将天气预报数据保存到本地内存表,通过LiveBindings进行显示。 ...
服务器·前端·javascript
The Chosen One9852 小时前
高进度算法模板速记(待完善)
java·前端·算法
陈随易2 小时前
MoonBit抓包模块pcap,查看电脑的每一次联网通信
前端·后端·程序员
新中地GIS开发老师3 小时前
WebGIS开发学生作品|低空航天管理与航线规划系统
前端·javascript·webgis·三维gis开发
用户059540174463 小时前
大模型对话记忆持久化踩坑实录:用 Playwright 自动化测了 300 次,终于揪出会话丢失的真凶
前端·css
丙氨酸長鏈3 小时前
Web前端入门第 问:JavaScript 一个简单的 IndexedDB 数据库入门示例
前端·javascript·数据库
kyriewen4 小时前
面试官让我手写虚拟列表——AI生成的版本,快速滚动几下就白屏了
前端·javascript·面试
IT_陈寒4 小时前
Vite热更新失效?你可能漏了这个配置
前端·人工智能·后端