AES_cfb128_encrypt() 函数需要解释
Posted
技术标签:
【中文标题】AES_cfb128_encrypt() 函数需要解释【英文标题】:Explanation needed with AES_cfb128_encrypt() function 【发布时间】:2021-11-24 20:17:50 【问题描述】:嘿,我正在寻找一些关于
的解释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)
我理解简单的变量,例如in
是我们的输入缓冲区out
是我们的输出缓冲区length
是我们的输入大小/输入缓冲区的字节数key
是指向我们通过 AES_set_encrypt_key 设置的密钥的指针enc
是我们想要的模式(无论是加密还是解密)
但是,我不明白 ivec 和 num 的作用。
我只知道(可能是错误的)是 ivec 代表初始向量,而我在网上找到的代码中的另一件事有一条评论:
/* set where on the 128 bit encrypted block to begin encryption*/
。起初,我认为这会在加密数据中留下未加密数据的空白,但当我在调试和打印值时查看字节值时,情况并非如此。
【问题讨论】:
ivec 保护您第二次加密同一消息。 【参考方案1】:ivec
是一个初始化向量,通常写为 IV。关键字是probabilistic encryption;
如果加密不是概率性的,那么当您使用相同的密钥重新加密消息时,您将得到相同的结果,并且窃听者会注意到这一点。这是一种简单的攻击,在某些模式下,这更像是 CTR 模式,其中在同一 IV 下加密两条消息会导致机密性丢失。
在 CFB 模式下,如果您对两条不同的消息进行加密,那么第一个块会受到攻击,攻击者会在其中获得消息的 x-or。
自从IV must be unpredictable 用于 CFB 模式(如在 CBC 模式中)以来,每个消息都应该生成随机 IV。
请注意,您需要将 IV 发送给接收方,以便解密工作。 IV 不需要保密,可以将其添加到密文中。
别忘了,这些都是过时的操作模式,在现代密码学中,我们更喜欢经过身份验证的加密模式,例如 AES-GCM、AES-CCM 和 ChaCha20-Poly1305。
而且,即使您不为每条消息生成随机密钥,密钥仍然是安全的!
【讨论】:
以上是关于AES_cfb128_encrypt() 函数需要解释的主要内容,如果未能解决你的问题,请参考以下文章
CryptoJS 中 CFB 模式中的 mcrypt_encrypt 函数
php openssl aes-256-cbc key长度自动匹配了128的长度,为啥