AES-256加密 (aes256)
AES-256 对称加密/解密,支持 ECB、CBC、CTR 三种分组密码模式。
- 密钥长度:32 字节
- 分块大小:16 字节
- 轮数:14 轮
常量
#define AES256_KEY_SIZE (32)
#define AES256_BLOCK_SIZE (16)
数据结构
struct aes256_ctx_t {
uint8_t xkey[4 * 8 * (14 + 1)];
};
xkey 存储 AES-256 的扩展密钥(14 轮 + 初始轮密钥,共 15 组,每组 8 个 32 位字,即 480 字节)。
API
void aes256_set_key(struct aes256_ctx_t * ctx, uint8_t * key);
设置 32 字节密钥,初始化加密上下文,完成密钥扩展。
void aes256_ecb_encrypt(struct aes256_ctx_t * ctx, uint8_t * in, uint8_t * out, int blks);
void aes256_ecb_decrypt(struct aes256_ctx_t * ctx, uint8_t * in, uint8_t * out, int blks);
ECB 模式加密/解密。in 和 out 必须为 blks * 16 字节,即输入必须是 16 字节的整数倍。
void aes256_cbc_encrypt(struct aes256_ctx_t * ctx, uint8_t * iv, uint8_t * in, uint8_t * out, int blks);
void aes256_cbc_decrypt(struct aes256_ctx_t * ctx, uint8_t * iv, uint8_t * in, uint8_t * out, int blks);
CBC 模式加密/解密。iv 为 16 字节初始向量,in 和 out 必须为 blks * 16 字节。加密时 iv 会被修改,如需保留原始 iv 请提前备份。
void aes256_ctr_encrypt(struct aes256_ctx_t * ctx, uint64_t offset, uint8_t * in, uint8_t * out, int bytes);
void aes256_ctr_decrypt(struct aes256_ctx_t * ctx, uint64_t offset, uint8_t * in, uint8_t * out, int bytes);
CTR 模式加密/解密。offset 为计数器偏移(块为单位),bytes 为处理的字节数。CTR 模式不要求输入为 16 字节的整数倍,且加密和解密使用相同操作。