PKCS7如何不丢失数据?

时间:2011-09-16 15:45:16

标签: cryptography aes pkcs#7

我正在为嵌入式系统开发USB引导加载程序,我的一个要求是USB上的数据传输应该是安全的(请耐心等待,我是加密的新手)。我决定用AES加密数据,但数据并不总是很好的16字节块,所以我需要填充它。似乎PKCS7是填充AES数据时使用的标准方法(更不用说它非常简单了),所以我想我想用它。

我遇到的问题是,我无法理解PKCS7如何不丢失数据。让我举一个例子来说明:

想象一下要加密的16字节缓冲区,其最后一个字符是0x01。现在想象一个15字节的缓冲区要加密......这个缓冲区将填充0x01。在两个缓冲区被加密,传输,接收和解密之后,接收器如何区分缓冲区与填充和实际最后一个字符为0x01的缓冲区之间的区别?

我觉得我在PKCS7规范中遗漏了一些东西。谁能帮我理解?提前谢谢。

2 个答案:

答案 0 :(得分:14)

是的,你错过了一点。如果数据长度是块长度的整数倍(即AES的16个字节的倍数),则填充将附加一个额外的完整块(0x10或16)而不是任何内容。

因此,我们总是可以从填充本身恢复填充的长度,因为没有“长度0填充”。

在缺点方面,加密数据始终大于纯文本,最多为整个块。

(在实际散列处理之前,大多数散列函数(如SHA-1)都进行了类似的填充,因此实际散列的阻塞输入是无冲突的 - 在某些情况下甚至比附加一个整数块更多,因为实际散列的数据以原始数据长度结束。)

答案 1 :(得分:5)

为简单起见,假设块长度为4而不是16。

以下是一些未填充的消息(十六进制):

01
01 02
01 02 03
01 02 03 04

这些填充形式是:

01 03 03 03
01 02 02 02
01 02 03 01
01 02 03 04 04 04 04 04

查看填充表单的最后一个字节,明确地告诉您要删除多少字节,以及这些字节的值必须是什么。如果最后一个字节是04,则必须删除4个字节,它们必须全部为04个字节;其他任何事情都表明信息腐败。