密碼學(xué)填充方式

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)的填充方式

參考文獻(xiàn)

1 Padding (cryptography)

2 Padding scheme for block ciphers

3 RFC 5652 Cryptographic Message Syntax (CMS)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容