【问题标题】:How does PKCS7 not lose data?PKCS7如何不丢失数据?
【发布时间】:2011-09-16 15:45:15
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: cryptography aes pkcs#7


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

      为简单起见,假设块长度为 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 字节;其他任何内容都表明消息损坏。

      【讨论】:

        猜你喜欢
        • 2021-07-27
        • 1970-01-01
        • 2013-03-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-12
        • 2013-08-21
        • 1970-01-01
        相关资源
        最近更新 更多