2014-11-14 15 views
1

我正在研究AES加密器和解密器。我決定使用PKCS#7。而現在,我不知道應該在哪裏提供有關填充長度的信息。我讀過,我可以讀取最後一個字節(== n),並檢查它是否低於16.如果是這樣,我可以檢查n個字節,如果它們相等n。但是這是一件事情。如果最後的塊加密具有16個字節,看起來像這樣的〔實施例:把填充長度信息放在哪裏?

{0x01, 0xfa,..., 0xf1, 0x02, 0x02} 

解密後,解密會讀它,並決定最後兩個字節進行填充(其實不是)。

我應該添加字節在長度的文件的開頭,解密器將讀取它並開始從第二個字節解密?

+1

我想你通常只需要添加一個填充塊就可以了,如果你的消息大小可以被塊的大小整除。 – 2014-11-14 13:26:44

+0

@Damien我認爲你是對的:) – 2014-11-14 13:39:48

回答

3

PKCS#7填充是確定性的。這意味着unpadding應該始終能夠找到填充長度本身。所以你先解密,然後取最後一個字節(如數字),那就是填充長度。 爲此,PKCS#7填充是始終使用。所以填充量以及字節的值對於塊大小是1,對於AES是16個字節。。如果明文已經可以被16除盡,則應用填充整塊 - 使用值爲16/0x10的字節。

總之,計算公式是:

p = n - l % n 

其中p是焊盤尺寸&值,n是塊的大小和l是明文的大小。

+0

如果您擔心攻擊者更改最後一個密文塊,請務必應用HMAC。 – 2014-11-14 13:38:46

+0

非常感謝 – s3ven 2014-11-14 13:53:03

-1

最佳做法是在加密數據之前添加帶有實際長度的32位前綴。

+0

爲什麼它應該有32位?它是否與整數大小連接? – s3ven 2014-11-14 13:25:55

+0

32bit是標準尺寸。如果塊總是<64K並且空間對你來說是重要的(例如嵌入式應用程序),那麼你也可以定義16位前綴。 – i486 2014-11-14 13:27:45

+0

投票下來,PKCS#7是確定性的,它不需要預先知道大小。事先知道大小*可以是有用的,但它不是特別需要執行PKCS#7無壓縮。 – 2014-11-14 13:46:23