0 Preface
在很多密碼學(xué)加密的情景下,對(duì)一塊信息進(jìn)行加密時(shí),要求信息塊與密鑰的長(zhǎng)度相等,而輸入的信息又不可能永遠(yuǎn)保持與密鑰長(zhǎng)度相等,且如此嚴(yán)重限制了輸入信息的自由度,因此需要將信息塊補(bǔ)齊到要求的長(zhǎng)度。
在補(bǔ)齊信息塊的同時(shí),還需要保證用于補(bǔ)齊的信息可以被很好的理解為是填充塊,不影響誤讀為原始信息塊的內(nèi)容,同時(shí),解密方需要能使用相同的填充方式而不會(huì)解析出具有多種可能性的原始信息塊,因此需要約定可以唯一辨識(shí)原始信息塊的填充方式。
1 位填充
位填充可用于任意長(zhǎng)度的信息。
在原始信息后添加一個(gè)“設(shè)定”位(“1”),再添加“重設(shè)”位(“0”)至要求的長(zhǎng)度?!爸卦O(shè)”位(“0”)的數(shù)量取決于原始信息末尾到塊邊緣的距離。其中填充的0的個(gè)數(shù)可以為0。
例如:
一段23位的信息可填充9位以填滿一個(gè)32位的塊
... | 1011 1001 1101 0100 0010 0111 0000 0000 |
位填充在很多哈希函數(shù)(例如MD5和SHA)中作為兩步填充方案中的第一步。
2 字節(jié)填充
字節(jié)填充可用于可編碼為整數(shù)字節(jié)(一個(gè)字節(jié)為8位)大小的信息。
2.1 ANSI X.923
ANSI X.923,即美國(guó)國(guó)家標(biāo)準(zhǔn)協(xié)會(huì)第 X.923 號(hào)標(biāo)準(zhǔn)
例如,塊的大小為8字節(jié),需要填充4字節(jié)
... | DD DD DD DD DD DD DD DD | DD DD DD DD 00 00 00 04 |
那么假設(shè)信息塊已經(jīng)滿8字節(jié),且塊末尾信息恰好符合填充規(guī)則,這時(shí)塊末尾信息是理解為原始信息還是填充信息呢?
例如
DD DD DD DD 00 00 00 04中的00 00 00 04既可以理解為原始信息,沒(méi)有填充,也可以理解為填充信息,這時(shí)就產(chǎn)生了歧義。
因此可以規(guī)定無(wú)論原始信息的最后一個(gè)塊是否滿8字節(jié),都需要在后面進(jìn)行填充。所以DD DD DD DD 00 00 00 04中的00 00 00 04只能理解為填充信息,如果原始信息為DD DD DD DD 00 00 00 04,則填充后的結(jié)果應(yīng)該為DD DD DD DD 00 00 00 04 | 00 00 00 00 00 00 00 08。如此便消除了歧義。
2.2 ISO 10126
ISO 10126即國(guó)際標(biāo)準(zhǔn)化組織第10126號(hào)標(biāo)準(zhǔn)。1991年發(fā)布,2007年被撤銷(xiāo)。
ISO 10126規(guī)定塊的最后一個(gè)字節(jié)寫(xiě)入填充的長(zhǎng)度,其他填充位置寫(xiě)入隨機(jī)數(shù)
例如,塊的大小為8字節(jié),需要填充4字節(jié)
... | DD DD DD DD DD DD DD DD | DD DD DD DD 81 A6 23 04 |
該種方式同樣會(huì)產(chǎn)生2.1章節(jié)中的歧義,因此采用2.1章節(jié)中相同的方式消除歧義。
2.3 PKCS #5 & PKCS #7
即公鑰密碼學(xué)標(biāo)準(zhǔn)第7號(hào)
每個(gè)填充字節(jié)的值是用于填充的字節(jié)的個(gè)數(shù),即是說(shuō),若需要填充N(xiāo)個(gè)字節(jié),則每個(gè)填充字節(jié)值都是N。填充的字節(jié)數(shù)取決于算法可以處理的最小數(shù)據(jù)塊的字節(jié)數(shù)量。
例如,塊大小為8字節(jié),需要填充4字節(jié)
... | DD DD DD DD DD DD DD DD | DD DD DD DD 04 04 04 04 |
那么假設(shè)信息塊已經(jīng)滿8字節(jié),且塊末尾信息恰好符合填充規(guī)則,這時(shí)塊末尾信息是理解為原始信息還是填充信息呢?
例如
DD DD DD DD 04 04 04 04中的4個(gè)04既可以理解為原始信息就是4個(gè)04,沒(méi)有填充,也可以理解為填充了4個(gè)04,這時(shí)就產(chǎn)生了歧義。
該種方式同樣會(huì)產(chǎn)生2.1章節(jié)中的歧義,因此采用2.1章節(jié)中相同的方式消除歧義。
PKCS #5和PKCS #7填充方式相同,但PKCS #5僅為使用64位塊大小的塊密碼定義使用。
2.4 ISO/IES 7816-4
ISO/IES 7816-4與位填充的方式相同,在需要填充的第一個(gè)位置填充80,之后填充多個(gè)00(00的個(gè)數(shù)可以為0)
例如
... | DD DD DD DD DD DD DD DD | DD DD DD DD 80 00 00 00 |
2.5 補(bǔ)零
在塊的最后填充0以達(dá)到塊的定長(zhǎng)
例如,塊大小為8字節(jié),需要填充4字節(jié)
... | DD DD DD DD DD DD DD DD | DD DD DD DD 00 00 00 00 |
該方式在原始信息末尾幾個(gè)字節(jié)為00時(shí)同樣會(huì)產(chǎn)生歧義,而且2.1章節(jié)中所述的方法無(wú)法解決該歧義。但0填充可以應(yīng)用在從其他方面可以獲知原始消息長(zhǎng)度的情況下。通常0填充可以應(yīng)用在二進(jìn)制編碼的字符串中,在字符串中,填充的0作為空字符而不需要顯示。
3 Openssl中的填充方式
Openssl中的填充方式有以下幾種
- 不填充
- PKCS #7
- 0填充
- ANSI X.923
- ISO 10126
其中 PKCS #7是默認(rèn)的填充方式