Encryption

Signal Protocol Header 密鑰加密初始化向量

  • May 24, 2019

Signal Protocol中,當您使用雙棘輪時,您有 2 個選項:

  1. 普通加密 =header + ciphertext
  2. 加密頭加密=encryptedHeader + ciphertext

加密的標頭加密具有加密公共棘輪密鑰對和計數器的優點,這也可以加密消息mac以及可能通過網路封裝的密文長度。

加密標頭時,您必須有一個初始化向量(又名 IV),因為密鑰只會在收到新的棘輪密鑰對後更改(在DH棘輪中移動一個步驟時(在雙棘輪文件中指定))。

您可以在DoubleRatchet - External Functions中閱讀有關標頭加密必須遵循的函式的更多資訊。

筆記:

  1. 標頭將使用 Java 中指定的“AES/CBC/PKCS5Padding”(在 Java 中 PKCS5Padding 實際上是 PKCS7Padding)或在具有CBC模式和PKCS7Padding作為填充的普通加密 AES中進行加密
  2. 棘輪公鑰為 32 字節

據我所知,我現在有 3 個選擇初始化向量的選項:

  1. 生成一個新的 16 字節初始化向量並將其添加到標頭之前
  2. 獲取目前棘輪公鑰的前 14 個字節(**注意:**棘輪公鑰在每個 DH 棘輪步驟中更改)並將目前計數器附加為short(**注意:**計數器增加每條消息並在每個 DH 棘輪步驟中重置為 0),這應該生成一個唯一的初始化向量,雖然大部分是可預測的(**注意:**這主要是可預測的,因為這是考慮它們是否真的具有棘輪公鑰和計數器,通過標頭加密它們被加密,因此它們應該不為惡意方所知)
  3. 僅使用第二個選項,而不是使用棘輪公鑰的前 14 個字節,例如前 30 個字節(一旦附加計數器將導致 32 個字節)甚至整個密鑰。

所以我的問題是,我應該選擇哪個?

需要考慮的事項:

  1. 第一個選項提供了一個更隨機的值,但會暴露它並佔用 16 個字節的空間。
  2. 第二個選項給出的隨機值較小,但前 14 個字節看起來仍然是隨機的,初始化向量不會暴露,這可能會提高安全性並減少 16 個字節的空間
  3. 第三個選項導致更大的初始化向量,使其更隨機

AES-CBC的安全契約是**初始化向量必須是統一的隨機且預先不可預測的——**僅有唯一性是不夠的(甚至沒有必要)。

選擇 IV 作為唯一 nonce 的偽隨機函式,甚至作為唯一 nonce 的偽隨機排列是安全的,發送方和接收方可以達成一致——例如,他們可以選擇它作為消息計數器,如果他們兩者都能夠計數——無需通過網路發送任何明確的 IV。實際上,您甚至可以使用在同一密鑰下使用 AES 加密的消息計數器,只要攻擊者無法控制計數器。

選擇 IV 作為攻擊者可以提前預測的任何東西是不安全的,例如之前通過網路發送的公鑰和可預測的計數器。

引用自:https://crypto.stackexchange.com/questions/70795