Encryption
Signal Protocol Header 密鑰加密初始化向量
在Signal Protocol中,當您使用雙棘輪時,您有 2 個選項:
- 普通加密 =
header + ciphertext
- 加密頭加密=
encryptedHeader + ciphertext
加密的標頭加密具有加密公共棘輪密鑰對和計數器的優點,這也可以加密消息mac以及可能通過網路封裝的密文長度。
加密標頭時,您必須有一個初始化向量(又名 IV),因為密鑰只會在收到新的棘輪密鑰對後更改(在DH棘輪中移動一個步驟時(在雙棘輪文件中指定))。
您可以在DoubleRatchet - External Functions中閱讀有關標頭加密必須遵循的函式的更多資訊。
筆記:
- 標頭將使用 Java 中指定的“AES/CBC/PKCS5Padding”(在 Java 中 PKCS5Padding 實際上是 PKCS7Padding)或在具有CBC模式和PKCS7Padding作為填充的普通加密 AES中進行加密
- 棘輪公鑰為 32 字節
據我所知,我現在有 3 個選擇初始化向量的選項:
- 生成一個新的 16 字節初始化向量並將其添加到標頭之前
- 獲取目前棘輪公鑰的前 14 個字節(**注意:**棘輪公鑰在每個 DH 棘輪步驟中更改)並將目前計數器附加為
short
(**注意:**計數器增加每條消息並在每個 DH 棘輪步驟中重置為 0),這應該生成一個唯一的初始化向量,雖然大部分是可預測的(**注意:**這主要是可預測的,因為這是考慮它們是否真的具有棘輪公鑰和計數器,通過標頭加密它們被加密,因此它們應該不為惡意方所知)- 僅使用第二個選項,而不是使用棘輪公鑰的前 14 個字節,例如前 30 個字節(一旦附加計數器將導致 32 個字節)甚至整個密鑰。
所以我的問題是,我應該選擇哪個?
需要考慮的事項:
- 第一個選項提供了一個更隨機的值,但會暴露它並佔用 16 個字節的空間。
- 第二個選項給出的隨機值較小,但前 14 個字節看起來仍然是隨機的,初始化向量不會暴露,這可能會提高安全性並減少 16 個字節的空間
- 第三個選項導致更大的初始化向量,使其更隨機
AES-CBC的安全契約是**初始化向量必須是統一的隨機且預先不可預測的——**僅有唯一性是不夠的(甚至沒有必要)。
選擇 IV 作為唯一 nonce 的偽隨機函式,甚至作為唯一 nonce 的偽隨機排列是安全的,發送方和接收方可以達成一致——例如,他們可以選擇它作為消息計數器,如果他們兩者都能夠計數——無需通過網路發送任何明確的 IV。實際上,您甚至可以使用在同一密鑰下使用 AES 加密的消息計數器,只要攻擊者無法控制計數器。
選擇 IV 作為攻擊者可以提前預測的任何東西是不安全的,例如之前通過網路發送的公鑰和可預測的計數器。