从我读过的一些文档和一些关于填充的问题来看,我认为如果我传递一个小于块大小的加密文本,openssl将按每个PKCS7填充它。并将填充的加密文本用作下一个数据块的IV。
但当我遵循示例 (改为cfb)时,我注意到在解密中,EVP_DecryptUpdate后的ctx->iv是加密文本填充的最后一部分,我无法理解。
ciphered text (hex): db 11 d7 9c a8 f2 1c 29 07 dc 6d 62 13 7a 5e bf 3a c2 fa 2f a1 0f 73 90 ae bd cf 57 cf 1f 82 a2 24 ac d1 de 29 6a e2 95 9c 0f ec
IV after decrypt (hex): 24 ac d1 de 29 6a e2 95 9c 0f ec 9a 95 f0 e3 14那么"9a 95 f0 e3 14“从何而来呢?
发布于 2015-05-05 09:41:16
密码反馈模式将分组密码(AES)转化为自同步流密码,将完整的密文块反馈给下一个IV。
如果您对小于块大小的倍数进行加密,它将不会使用所有块密码输出来创建加密文本,只需要它所需的数量。因此,也不需要填充物。但是,它仍然需要块密码的全部输出来“反馈”并创建更多的流输出。
在您的例子中,密文块是:
db 11 d7 9c a8 f2 1c 29 07 dc 6d 62 13 7a 5e bf
3a c2 fa 2f a1 0f 73 90 ae bd cf 57 cf 1f 82 a2
24 ac d1 de 29 6a e2 95 9c 0f ec如您所见,最后一个文件在0xEC之后被截断,因为它不需要它。块密码输出流的其余5个字节是下一个IV的最后5个字节。实际上,如果您决定使用相同的流加密更多的数据,那么这5个字节将是针对明文创建密文的XORed,这将在反馈到分组密码之前对它们进行更改。
CFB、OFB和CTR模式是流密码模式,因此不需要填充。没有什么可以阻止您强制填充,但与欧洲央行/CBC模式不同的是,您不需要它来处理不是块大小倍数的数据。
https://crypto.stackexchange.com/questions/25434
复制相似问题