如 aes,des 一類的分組對稱加密演算法要求明文資料的位元組長度必須是其塊大小的倍數,因此在加密明文資料之前我們必須對明文資料進行填充。在分組對稱加密演算法中,我們通常在加密之前在明文資料的末尾新增對應的填充資料使資料達到演算法塊大小的倍數;並且在解密資料之後將對應的填充內容去掉。
填充的方法具體來說分為基於二進位制位 bit 的和基於位元組 byte 的。其中基於位元組的填充分為:ansi x9.23,iso 10126,pkcs#5 與 pkcs#7,零填充。本文中涉及到的位元組資料均使用 16 進製表示。
二進位制位填充可以用於填充任意大小的明文資料。二進位制位填充的原理是在資料的末尾的第乙個二進位制位填充1
,然後在後面填充0
,0
的數量由業務需要的填充位數決定。
二進位制位填充可以填充以二進位制位為單位的資料,也可以填充以位元組為單位的資料。當它以位元組為單位進行填充時,又稱為iso/iec 7816-4填充,也就是填充內容類似0x80 0x00
這樣的填充。
下面是乙個基於二進位制位的填充案例,假設我們有乙個 23 bit 的明文資料,需要填充 9 bit 到 32 bit,那麼我們需要填充 1 bit 的1
和 8 bit 的0
:
# 明文資料
...... | 1011 1001 1101 0100 0010 011
# 填充後的資料
...... | 1011 1001 1101 0100 0010 011 1 0000 0000 |
對於位元組填充來說,假設我們需要將資料填充 4 個 byte 達到 8 byte 的塊大小,我們需要在資料末尾的第乙個位元組填充0x80
,後面三個位元組填充0x00
:
# 明文資料
...... | dd dd dd dd dd dd dd dd | dd dd dd dd
# 填充後的資料
...... | dd dd dd dd dd dd dd dd | dd dd dd dd 80 00 00 00 |
ansi x9.23 是針對塊大小為 8 的演算法設計的填充模式,需要注意的是該標準已經被撤銷。
在 ansi x9.23 中,使用0x01
到0x08
對資料進行填充。對於填充內容可以使用任意隨機數(一般來說固定使用0x00
),並且將填充內容的最後乙個位元組設定為填充內容的長度。事實上我們可以很容易的將該標準應用於填充0x01
到0xff
範圍的資料塊。
下面是塊大小為 8 個位元組,需要填充 4 個位元組的內容:
# 明文資料
...... | dd dd dd dd dd dd dd dd | dd dd dd dd
# 填充後的資料
...... | dd dd dd dd dd dd dd dd | dd dd dd dd 00 00 00 04 |
注意:ansi x9.23 對於剛好是塊大小倍數的明文資料不進行填充。
iso 10126 目前也是已經撤銷的標準,它在設計上和 ansi x9.23 標準有些類似,均是通過隨機數作為填充內容並在填充內容的最後乙個位元組指定填充內容的長度。
下面是塊大小為 8 個位元組,需要填充 4 個位元組的內容:
# 明文資料
...... | dd dd dd dd dd dd dd dd | dd dd dd dd
# 填充後的資料
...... | dd dd dd dd dd dd dd dd | dd dd dd dd 81 a6 23 04 |
注意:iso 10126 對於剛好是塊大小倍數的明文資料也會進行填充^1:
下面是塊大小為 8 個位元組,需要填充 8 個位元組的內容:
# 明文資料
...... | dd dd dd dd dd dd dd dd |
# 填充後的資料
...... | dd dd dd dd dd dd dd dd | 98 ef 35 27 81 a6 23 08 |
pkcs#7 實際上是為了支援 aes 演算法而對 pkcs#5 做的擴充套件,因為 pkcs#5 設計上只是針對 8 位元組大小的塊做填充的。也就是說,在實踐中 pkcs#5 和 pkcs#7 是等同的。
pkcs#7 的 rfc 規範見 rfc 5652 - section-6.3。
pkcs#7 的填充內容其實就是要填充的資料長度,如果要填充 n 個位元組,那麼每個位元組都是 n 。需要新增的位元組數取決於塊的大小,當且僅當 n 小於 256 時,該填充方法是有效的。
填充的內容可能是下面的某一種:
01
02 02
03 03 03
04 04 04 04
05 05 05 05 05
06 06 06 06 06 06 06
......
下面是塊大小為 8 個位元組,需要填充 4 個位元組內容;和塊大小為 8 個位元組,需要填充 8 個位元組內容的案例:
# 明文資料
...... | dd dd dd dd dd dd dd dd | dd dd dd dd
# 填充後的資料
...... | dd dd dd dd dd dd dd dd | dd dd dd dd 04 04 04 04 |
# 明文資料
...... | dd dd dd dd dd dd dd dd |
# 填充後的資料
...... | dd dd dd dd dd dd dd dd | 08 08 08 08 08 08 08 08 08 |
這裡如果資料長度已經是塊大小的倍數了,還是需要填充塊大小長度的填充內容。只有這樣在解密的時候,演算法才能確定的認為解密出來的資料的最後一位是填充的內容,並且填充的資料長度就是該位元組的大小。否則,演算法無法判斷最後乙個位元組是填充值還是明文值,也就無法進行去掉填充內容的操作。
零填充是指將需要填充的所有位元組都填充為零,該方案尚未被標準化。零填充也被叫做空填充或零位元組填充。
下面是塊大小為 8 個位元組,需要填充 4 個位元組內容的案例:
...... | dd dd dd dd dd dd dd dd | dd dd dd dd 00 00 00 00 |
注意:如果填充的明文資料本來就以乙個或多個零位元組接收,那麼零填充在解密後可能無法被去填充,原因是解密演算法無法區分零位元組是明文資料的還是填充內容。一般而言,比較適用於填充二進位制編碼的字串,在字串中空字元0x00
被看做是字串結束的位元組,是可以被剝離的。
如果資料長度已經是塊大小的倍數了,視情況可以填充塊大小長度的填充內容,這視具體的實現而定。
Des對稱加密
1 package com.util 2import j a.io.ioexception 3import j a.security.securerandom 45 import j ax.crypto.cipher 6import j ax.crypto.secretkey 7import j a...
對稱加密 DES演算法
對稱加解密演算法 a.通訊雙方同時掌握乙個金鑰,加密解密都是由乙個金鑰完成的 即加密金鑰等於解密金鑰,加解密金鑰可以相互推倒出來 b.雙方通訊前共同擬定乙個金鑰,不對第三方公開。c.不具有個體原子性,乙個金鑰被共享,洩漏機率增大 原理 該演算法是乙個利用56 8奇偶校驗位 第8,16,24,32,4...
對稱加密 DES 與非對稱加密 RSA
對稱加密和非對稱加密都有分國際演算法和國密演算法。對稱加密 des 國際演算法 sm4 國密演算法 非對稱加密 rsa 國際演算法 sm2 國密演算法 rsa的公鑰 私鑰的組成,以及加密 解密的公式可見於下表 素數是這樣的整數,它除了能表示為它自己和1的乘積以外,不能表示為任何其它兩個整數的乘積。公...