AES_cfb128_encrypt函数ivec、num参数作用相关问题咨询
AES_cfb128_encrypt 函数参数详解
函数原型如下:
void AES_cfb128_encrypt(const unsigned char *in, unsigned char *out, size_t length, const AES_KEY *key, unsigned char *ivec, int *num, int enc)
你已经明确的基础参数这里不再赘述,以下针对ivec和num两个参数的作用做专业说明:
ivec 参数
ivec全称为 Initialization Vector(初始向量),作用和规则如下:
- 长度固定为16字节(128位),和AES算法的块大小完全匹配
- 加密、解密两端必须使用完全相同的初始向量,才能正确完成加解密流程
- 它是读写参数:函数调用过程中会自动更新该参数的值,保存当前加密/解密的状态,用于下一次增量调用,调用过程中无需手动修改其内容
- 安全要求:同一个加密密钥不能重复使用相同的初始向量,否则会面临明文泄露的风险
num 参数
你看到的注释/* set where on the 128 bit encrypted block to begin encryption*/描述的就是num的作用,它的本质是当前密钥流块的已使用偏移量,具体逻辑如下:
CFB128属于AES的流密码工作模式,不需要输入数据长度为16字节的整数倍:算法每次会先通过AES加密生成1个16字节的密钥流块,再将密钥流和输入数据逐字节异或,得到输出结果。
如果单次调用传入的length不是16的整数倍,或者采用增量调用(分批传入待处理数据),就会存在部分生成好的密钥流没有用完的情况,num就是记录当前16字节密钥流块已经被消耗了多少字节,取值范围固定为0~15。
关于「未加密空白」的误区说明
num记录的是密钥流的使用偏移,不是输入数据的偏移,不会跳过任何输入字节:比如num值为3,代表当前已生成的16字节密钥流的前3字节已经被之前的调用消耗完了,本次调用会从密钥流的第4个字节开始,和输入缓冲区的第1个字节逐位异或,所有输入数据都会经过加密处理,不会存在未加密的空白。
使用注意事项
- 首次调用函数前,必须将
num初始化为0,ivec初始化为加解密双方约定好的初始向量 - 多次增量调用之间,不要手动修改
ivec和num的值,函数会自动更新状态保证加解密连续性 - CFB模式下解密操作也会使用AES加密密钥调度,因此
key参数只需要通过AES_set_encrypt_key设置即可,解密时不需要单独设置解密密钥
内容的提问来源于stack exchange,提问作者StwayneXG
相关产品推荐
相关产品推荐

