Contents

AES 加密過後長度有多少?

在處理數據加密時,我們經常需要考慮到加密後的數據長度。這對於設計資料表和確保資料安全都是非常重要的。在這篇文章中,我將解釋 AES 加密和 Base64 編碼的長度如何計算。

AES 加密的 Byte 長度

在處理資料加密時,我們經常需要考慮到加密後的資料長度。這對於設計資料庫表格和確保數據安全都是非常重要的。在這篇文章中,我將解釋 AES 加密和 Base64 編碼的長度如何計算。

從第 1 行的回應來看,如果 padding 的方法是使用 PKCS5 或 PKCS7 的話,加密後的長度如下:

1
cipherLen = (clearLen/16 + 1) * 16;

參考: 黑毛到白毛的攻城獅之路: 使用 AES 加密後的資料長度

這邊注意,假如你存的身分證是有 10 位數,這邊 (10/16+1)*16=26,但這邊跟我拿到 24 不一樣。這邊我沒注意的事情有兩點,這邊晚點再提。

AES 密文與明文長度的關係 - 張占嶺 - 博客園

由於採用了 256 位 AES 加密,使用了 CBC 模式加 PKCS #5 補齊,所以 AES 的密文字節長度 = (明文長度 +1) / 16 * 16(即比明文長度大的最小的 16 的倍數)。

{{<admonition type=tip>}}
這邊我們看到 (clearLen/16 + 1)clearLen/16 一開始要先除以整數,所以得到會是 0,所以透過 0+1 再乘以 16 等於 16,跟我 24 長度還是不一樣阿。

後來發現,這邊 AES 長度是 Byte 算出來結果,我標題有破梗,通常我們家密都會轉成 Base64,只要把長度轉成 Base64 長度就可以了。
{{</admonition>}}

AES64 編碼的長度

在將 AES 加密的結果儲存或傳輸時,我們通常會將其轉換為 Base64 格式。這是因為 Base64 編碼可以將任意的二進位制數據轉換為只包含 ASCII 字元的字串,這使得數據更容易被處理和傳輸。然而,這種轉換也會增加數據的長度。Base64 編碼的長度可以用以下公式來計算:

base64Len = ceil(len(data) / 3) * 4

這裡的 len(data) 是原始數據的長度,base64Len 是 Base64 編碼後的長度。

以下是一個 Python 代碼範例,它展示了如何計算 Base64 編碼的長度:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
from hashlib import sha256
from math import ceil
from base64 import b64encode

# 原始數據
data = 'test'

# 計算Base64編碼的長度
base64Len_formula = ceil(len(data) / 3) * 4
base64Len_actual = len(b64encode(data.encode()).decode())

print('公式計算長度: ', base64Len_formula)
print('實際編碼長度: ', base64Len_actual)

# 計算SHA256編碼後的長度
sha256Len = len(b64encode(sha256(data.encode('utf-8')).digest()).decode())
print('SHA256編碼後長度: ', sha256Len)

ceil(len(data) / 3) * 4 這邊公式,長度/3無條件進位取整數再乘以 4,16/3=5.x=>6,6*4=24,得到我加密後的數字。