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