Padding - 加密中的填充機制

想像你正在寄送一箱珍貴的瓷器。為了確保瓷器在運輸過程中的安全,你會用泡棉或其他緩衝材料填滿箱子的空隙。在資料加密的世界裡,Padding(填充)就扮演著類似的角色。

現代加密系統就像一個標準化的包裝箱,它要求所有要加密的資料都必須是固定大小的區塊。然而,現實世界中的資料就像各種不同大小的物品,很少剛好符合這個固定大小。這時候,我們就需要填充機制來補足這些空缺。

本文將介紹不同的填充機制,讓你了解如何在加密中使用Padding,以確保資料的完整性和安全性。

填充的藝術:從位元到位元組

位元層級的填充:精確到每一個位元

想像你正在玩俄羅斯方塊,需要完美地填滿每一行。位元層級的填充就是這樣的過程,只不過我們處理的是0和1的世界。

1. 1n0s 填充(ISO 7816標準)

這就像在一列數字後面放一個醒目的標記1,然後用0填滿剩餘空間。這種方法的優雅之處在於,不論原始資料是什麼,我們總能準確地找到資料的結束位置。

比如說,如果我們的資料是:

1
2
填充前:1100 1010 11
填充後:1100 1010 1110 0000

這個1就像一個路標,清楚地標記著「真實資料到此為止」。

2. 0n1s 填充

這種方法與1n0s相反,就像是在資料後面鋪上一條由0組成的紅地毯,最後放上一個1作為終點標記。這對某些特定的應用場景特別有用,尤其是當我們需要從後向前讀取資料的時候。

1
2
填充前:1100 1010 11
填充後:1100 1010 1100 0001

3. TBC(尾部位元補充)

這是一種更巧妙的方法,就像是在打乒乓球時,要根據對手的來球決定如何回擊。TBC會觀察最後一個位元是0還是1,然後用相反的數值進行填充。這樣的設計確保了填充後的資料一定與原始資料不同,增加了安全性。

1
2
3
4
5
填充前:1100 1010 11        # 最後一位是 1
填充後:1100 1010 1100 0000 # 用 0 填充

填充前:1100 1010 10 # 最後一位是 0
填充後:1100 1010 1011 1111 # 用 1 填充

位元組層級的填充:更大尺度的藝術

位元組層級的填充就像是在處理更大的積木,每次都是8個位元一組進行操作。

1. PKCS#7:最受歡迎的填充方式

這種方法簡單而優雅:需要填充多少個位元組,就用這個數字去填充。比如需要填充3個位元組,就填入 03, 03, 03。這就像在每個填充的位置都放上一個數字標籤,告訴我們「這裡有3格是填充的」。

想像一個具體的例子:

1
2
3
4
5
6
7
8
# 情況一:需要填充 3 個位元組
填充前: |AA|BB|CC|DD|EE|
填充後: |AA|BB|CC|DD|EE|03|03|03|

# 情況二:恰好滿足區塊大小(16 位元組)
填充前: |AA|BB|CC|DD|EE|FF|GG|HH|II|JJ|KK|LL|MM|NN|OO|PP|
填充後: |AA|BB|CC|DD|EE|FF|GG|HH|II|JJ|KK|LL|MM|NN|OO|PP|
|10|10|10|10|10|10|10|10|10|10|10|10|10|10|10|10|

2. ANSI X.923:節省空間的方案

這種方法更像是一個謹慎的管理員,用0做填充,只在最後放一個數字說明填充了多少位置。這種方法非常節省空間,但也需要更小心地處理填充的驗證。

1
2
3
# 需要填充 3 個位元組
填充前:|AA|BB|CC|DD|EE|
填充後:|AA|BB|CC|DD|EE|00|00|03|

3. ISO 10126:隨機填充的藝術

這種方法就像是在填充位置灑上五彩繽紛的碎紙,只在最後放一個數字說明填充的數量。這種隨機性讓攻擊者更難預測和分析填充的內容。

1
2
3
# 需要填充 3 個位元組(XX 代表隨機值)
填充前:|AA|BB|CC|DD|EE|
填充後:|AA|BB|CC|DD|EE|XX|XX|03|

CTS:無需填充的絕妙技巧

有時候,我們可以通過巧妙的設計完全避免填充。CTS(密文竊取)就是這樣的一種技術。想像你在玩拼圖,最後剩下的一塊不完整,CTS就像是從前面完整的拼圖借一部分來完成最後的拼接。

1
2
3
4
5
6
7
8
# CBC-CTS 模式下的處理(16 位元組區塊)
原始資料(31 位元組):
|AA|BB|CC|DD|EE|FF|GG|HH|II|JJ|KK|LL|MM|NN|OO|PP| (第一區塊)
|QQ|RR|SS|TT|UU|VV|WW|XX|YY|ZZ|11|22|33|44|55| (第二區塊,缺 1 位元組)

加密後:
|C1|C1|C1|C1|C1|C1|C1|C1|C1|C1|C1|C1|C1|C1|C1|C1| (第一區塊密文)
|C2|C2|C2|C2|C2|C2|C2|C2|C2|C2|C2|C2|C2|C2|C2| (第二區塊密文)

ECB-CTS和CBC-CTS

這兩種模式像是兩種不同的拼圖策略。ECB-CTS更直接,而CBC-CTS則增加了額外的混淆,使得每一塊拼圖都與前一塊有關聯,提供了更好的安全性。

安全性的考量:填充的防護

填充安全就像是在建造一座堡壘,不僅要考慮牆的高度,還要注意每一個可能的漏洞。一些需要特別注意的點包括:

  1. 填充預言攻擊:想像攻擊者像偵探一樣,通過系統對不同填充的反應來推斷加密的內容。
1
2
3
4
5
6
7
8
正常的 PKCS#7 填充:
|DD|DD|DD|DD|04|04|04|04| ✓ (合法的 4 位元組填充)

可能被攻擊者篡改的填充:
|DD|DD|DD|DD|04|04|04|03| ✗ (非法填充)
|DD|DD|DD|DD|04|04|03|04| ✗ (非法填充)
|DD|DD|DD|DD|04|03|04|04| ✗ (非法填充)
|DD|DD|DD|DD|03|04|04|04| ✗ (非法填充)
  1. 填充驗證:就像檢查包裹是否完好無損,我們需要仔細驗證填充的正確性。

  2. 資訊洩露:填充可能會無意中透露原始資料的一些特徵,就像包裝可能透露出內部物品的形狀。

實際應用中的權衡

在實際應用中選擇填充方式,就像是在選擇包裝材料,需要考慮:

  • 效率:不同填充方式對處理速度的影響
  • 安全性:對各種攻擊的抵抗能力
  • 兼容性:與其他系統的配合程度
  • 空間開銷:填充帶來的額外儲存需求

結論

填充機制是現代密碼學中不可或缺的一環,就像是安全大廈中的最後一塊基石。它不僅要確保資料能夠正確地被加密和解密,還要在效率和安全性之間取得平衡。理解和正確使用填充機制,是構建安全系統的重要基礎。

延伸閱讀

  • PKCS#7
  • RFC 5652
  • NIST SP800-38A 區塊加密模式建議
  • ISO/IEC 7816-4

也許你也會想看看