cryptography - PKCS7 如何不丢失数据?

标签 cryptography aes pkcs#7

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

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

想象一个要加密的 16 字节缓冲区,其最后一个字符是 0x01。现在想象一个要加密的 15 字节缓冲区……这个缓冲区将用 0x01 填充。两个缓冲区都加密、发送、接收和解密后,接收方如何区分带填充的缓冲区和实际最后一个字符为 0x01 的缓冲区?

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

最佳答案

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

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

不利的一面是,加密数据总是比纯文本大,最多大一个完整的块。

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

关于cryptography - PKCS7 如何不丢失数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7447242/

相关文章:

java - RSA加密-AES key 解密并存储在文件中

c# - 以编程方式确定 *.ts 视频文件是否使用 aes 128 加密

java - 重用密码(防止初始化)

java - 如何使用 Java 使用 RSA 私钥

javascript - 如何使用 JavaScript 中具有短签名的 key 对数据进行签名

security - 在 Web 应用程序中对数据进行数字签名

python - 从python中的PKCS7信封中提取userCertificate

java - 如何在 Java 中生成一个随机的 9 位数字?

encryption - 使用 AES 进行文件完整性检查,替换 MD5

c# - 如何从 PKCS#7 中提取 PKCS#1 签名