初始化毕业设计项目
This commit is contained in:
@@ -0,0 +1,99 @@
|
||||
/*
|
||||
* 加密模块实现
|
||||
* 使用AES-128-CBC + Base64编码
|
||||
*/
|
||||
|
||||
#include "Crypto.h"
|
||||
#include "aes.h"
|
||||
#include "base64.h"
|
||||
#include <string.h>
|
||||
|
||||
// ⚠️ 重要:密钥和IV必须与服务器端完全一致!
|
||||
// AES-128密钥(16字节)
|
||||
static const uint8_t AES_KEY[16] = {
|
||||
0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6,
|
||||
0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c
|
||||
};
|
||||
|
||||
// 初始化向量(16字节)
|
||||
static const uint8_t AES_IV[16] = {
|
||||
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
||||
0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
|
||||
};
|
||||
|
||||
static struct AES_ctx aes_ctx;
|
||||
|
||||
void Crypto_Init(void)
|
||||
{
|
||||
// 初始化AES上下文(使用CBC模式)
|
||||
AES_init_ctx_iv(&aes_ctx, AES_KEY, AES_IV);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief PKCS#7填充
|
||||
* 将数据填充到16字节的倍数
|
||||
*/
|
||||
static uint32_t pkcs7_pad(uint8_t* data, uint32_t data_len, uint32_t buffer_size)
|
||||
{
|
||||
// 计算需要填充的字节数
|
||||
uint32_t padding_len = 16 - (data_len % 16);
|
||||
|
||||
// 检查缓冲区是否足够
|
||||
if (data_len + padding_len > buffer_size) {
|
||||
return 0; // 缓冲区不足
|
||||
}
|
||||
|
||||
// 填充(PKCS#7标准)
|
||||
uint32_t i;
|
||||
for (i = 0; i < padding_len; i++) {
|
||||
data[data_len + i] = (uint8_t)padding_len;
|
||||
}
|
||||
|
||||
return data_len + padding_len;
|
||||
}
|
||||
|
||||
uint32_t Crypto_EncryptJSON(const char* json_data, char* encrypted_output)
|
||||
{
|
||||
uint32_t json_len = strlen(json_data);
|
||||
uint8_t buffer[512]; // 临时缓冲区
|
||||
|
||||
// 1. 复制JSON数据到缓冲区
|
||||
if (json_len > sizeof(buffer) - 16) {
|
||||
return 0; // 数据太长
|
||||
}
|
||||
memcpy(buffer, json_data, json_len);
|
||||
|
||||
// 2. PKCS#7填充到16字节的倍数
|
||||
uint32_t padded_len = pkcs7_pad(buffer, json_len, sizeof(buffer));
|
||||
if (padded_len == 0) {
|
||||
return 0; // 填充失败
|
||||
}
|
||||
|
||||
// 3. 手动实现标准CBC加密(绕过aes.c的bug)
|
||||
struct AES_ctx ctx;
|
||||
uint8_t iv[16];
|
||||
uint32_t i, j;
|
||||
|
||||
// 初始化密钥和IV
|
||||
AES_init_ctx(&ctx, AES_KEY);
|
||||
memcpy(iv, AES_IV, 16);
|
||||
|
||||
// CBC加密:每个块先XOR IV,再加密,然后用密文更新IV
|
||||
for (i = 0; i < padded_len; i += 16) {
|
||||
// XOR with IV
|
||||
for (j = 0; j < 16; j++) {
|
||||
buffer[i + j] ^= iv[j];
|
||||
}
|
||||
|
||||
// AES加密单个块
|
||||
AES_ECB_encrypt(&ctx, &buffer[i]);
|
||||
|
||||
// 更新IV为当前密文块
|
||||
memcpy(iv, &buffer[i], 16);
|
||||
}
|
||||
|
||||
// 4. Base64编码
|
||||
uint32_t encoded_len = base64_encode(buffer, padded_len, encrypted_output);
|
||||
|
||||
return encoded_len;
|
||||
}
|
||||
Reference in New Issue
Block a user