在crypt文件中没有填充的AES解密

时间:2018-04-26 11:48:54

标签: c encryption aes padding

我想用AES 128位算法解密一个crypt文件而不填充:IV(初始向量)和密钥长度为16个字节。 我可以使用OpenSSL来做到这一点,但我不会使用它来比较结果。 我的主要问题不是取消加密文件的填充,而是重新生成它,我不知道该怎么做,OpenSSL就是这样做的。 例如,在19字节的文件上,crypt文件上的填充将是13个字节长,因此crypt文件将保存为32个字节长,但我想删除它。是否有一些功能可以添加到我必须使用的C / C ++程序中?

编辑:请不要快速回答我的问题,这段代码不会在电脑上使用,而是在一张小电子卡上使用,而且我没有一些有用的命令;这是一个轻巧的Linux操作系统

AES块长度为16个字节,因此当最后一个块不是16个字节时需要填充

由于

1 个答案:

答案 0 :(得分:0)

密文未填充 - 明文被填充,因此它们是加密算法的有效输入。

AES算法要求输入为16字节块的整数,其输出长度与输入相同。

因此,对于您的19字节纯文本文件,您用于加密的任何工具都是:

  1. 添加13个字节(可能在末尾),产生一个32字节的填充明文。结果需要包含有关填充的信息,以便接收端可以删除它。
  2. 加密填充明文,产生32字节密文
  3. 重要信息在密文的32个字节之间均匀分布,因此无法修改密文而不会使其无效

    最后,当你解密时,你需要:

    1. 解密32字节密文,产生32字节填充明文
    2. 删除最后13个字节,产生原始明文
    3. 您的问题的措辞表明您已经知道如何解密,并且删除填充是问题所在。

      那么,你怎么知道修剪多少字节?这取决于使用什么填充方案来创建它。 There are many - see Wikipedia

      一种常见的填充方案是PKCS#7,其中填充字节都具有 n 的值,其中 n 是添加的字节数。因此在您的示例中,13个字节的填充字节都具有值13.要删除它,只需读取最后一个字节,然后修剪该字节数。

      (请注意,在PKCS#7中,一个已经是整数个块的输入,将添加一个额外的块,每个字节设置为16个。)

      但是,不要假设你的加密端正在使用PKCS#7 - 确定无误。要么通过查看正在进行加密的文档/来源,要么通过解密和检查仍然填充明文的内容来实证。

相关问题