Protocol-Design

證明協議不可攻擊

  • May 9, 2022

考慮以下協議:

  1. $ A\rightarrow B: {N_A,A}_{pk(B)} $
  2. $ B\rightarrow A: {N_B,N_A}_{pk(A)} $
  3. $ A\rightarrow B: hash(N_B, A, B) $

打算在哪裡 $ A $ 或者 $ B $ 已經完成了他們自己在協議中的角色,他們確信對方已經和他們一起參與了協議,並且 $ N_A $ 和 $ N_B $ 是隨機生成的 $ A $ 和 $ B $ . $ {X}_{Y} $ 意思是 $ X $ 在密鑰下加密 $ Y $ .

我知道這個協議不存在攻擊,但我不確定如何證明它。

沒有明確定義的攻擊者能力,也沒有不同組件(公鑰加密、雜湊函式等)的安全保證。很難說這個協議是否“可附加”。

鑑於我們獲得了“全權委託”,我將展示兩種基於不同安全性和攻擊者模型的 PITM 攻擊。

一般攻擊者模型:我假設攻擊者可以完全控製網路,他們可以注入、重新排序、修改和刪除消息。此外,攻擊者可以隨時“註冊”新使用者。

攻擊 1:身份錯誤綁定以及需要比 CPA 更安全的 PKE

正如所寫的,只要使用“安全”的 PKE 方案,該協議似乎就應該是安全的。然而,語義安全中的基本安全概念是不夠的。在高層次上,在攻擊結束時, $ A $ 認為他們正在交談 $ B $ , 儘管 $ B $ 認為他們正在與攻擊者交談 $ E $ .

為此,我們將展示一個可能受到攻擊的 CPA 安全 PKE。讓 $ \mathcal E $ 是基於陷門功能的“混合” PKE 方案(否則基於)。消息加密的地方 $ m $ 在下面 $ pk $ ,大致包括生成一個隨機值 $ s $ 然後生成一個對稱加密密鑰 $ k = H(s) $ . $ k $ 然後用於使用類似流密碼的算法加密消息,創建密文 $ c $ . PKE 方案的最終密文是$$ {m}{pk} = (enc{PKE}(pk, s), c) $$ 攻擊工作如下。

  1. $ A\rightarrow B: c_1 = {N_A,A}_{pk(B)} $
  2. 攻擊者截獲此消息,創建一個新使用者 $ E $ , 將密文修改為一個值 $ c_1’ $ 這樣它解密為 $ N_A, E $ . 這是可能的,因為我們使用的是流密碼。(例如,我們還假設隨機數和身份是固定長度的,等等……)
  3. $ B $ 解密消息並似乎 $ E’s $ 身份,因此第二條消息被發送到 $ E $
  4. $ B \rightarrow E: c_2 = {N_A. N_B}_{pk_E} $ .
  5. $ E $ 解密 $ c_2 $ ,並獲得隨機數。
  6. $ E \rightarrow A: c_2’ = {N_A, N_B}_{pk_A} $
  7. $ A \rightarrow B: c_3 = H(N_B, A, B) $
  8. $ E $ 攔截 dropbs $ c_3 $ 並且寄出 $ c_3’ = H(N_B, E, B) $

從上面的流程來看, $ A $ 就好像它與 $ B $ ,而視圖 $ B $ 就好像它與 $ E $ .

攻擊 2:長期秘密暴露和密鑰洩露完整性

在這裡,攻擊者的能力得到了加強,我們允許洩露長期密鑰。現在很明顯,如果 $ sk_A $ 受到損害(和 $ A $ 尚未意識到)攻擊者可以冒充 $ A $ 隨意; 然而,期望如果 $ A $ 與誠實的人開會 $ B $ , $ A $ 應該對她和誰交談有把握。然而在這次攻擊中,妥協的 $ sk_A $ 意味著攻擊者可以冒充任何人 $ A $ .

上面的基本思想是,PITM 攻擊者將能夠解密第二條消息 $ {N_A, N_B}_{pk_A} $ . 攻擊者現在可以結束與 $ A $ 並“切斷電線”朝向 B。因此, $ A $ 認為他們在說話 $ B $ 而實際上是在與 B 交談。

我會假設很多關於問題中沒有明確的協議。我在這個答案的第二部分陳述了其中的一些內容。此外,我不會讓我的論點過於詳細。

想要的保險是

(參與者)確信對方已經與他們一起參與了協議

但我會和他們一起刪除,因為這還不清楚,而且我沒有看到加密可以滿足的精確定義(中間人總是有可能以不變的方式中繼消息)。我將把它替換為自從協議開始以來,不要將它與**協議通常採用的更強大的方式相混淆。

在第 1 步, $ N_A $ 被隨機選擇 $ A $ 並在下加密 $ pk(B) $ ,作為明文的一部分 $ {N_A,A}{pk(B)} $ . 因此只有 $ A $ 或具有某種程度的破譯能力的實體 $ {N_A,A}{pk(B)} $ , 那隻是 $ B $ , 可以知道任何事情 $ N_A $ 除了它的長度。因此,當第 2 步結束時, $ A $ 收到可以解密的東西 $ N_A $ , 他們知道他們沒有使用 $ N_A $ 除了生成步驟 1 的消息之外,他們有保證 $ B $ 參與了協議。我不會將這種保證量化,而是將其保留給另一個方向。

在第 2 步, $ N_B $ 被隨機選擇 $ B $ 並在下加密 $ pk(A) $ ,作為明文的一部分 $ {N_B,N_A}{pk(A)} $ . 因此只有 $ B $ 或具有一定程度破譯能力的實體 $ {N_B,N_A}{pk(A)} $ , 那隻是 $ A $ , 可以知道任何事情 $ N_B $ 除了它的長度。假設

  (a) 雜湊是一個具有輸出寬度的隨機預言機 $ k_H $ ,

  (b) $ N_B $ 是隨機均勻選擇的,並且有寬度 $ k_N $ ,

  (c) 任何對手的優勢為 $ \epsilon $ 反對加密,

然後將對手錶示為機率上限 $ 2^{-k_H}+2^{-k_N}+\epsilon $ 準確地找到第 3 步的雜湊值。因此,當第 3 步結束時, $ B $ 為他們重新計算的雜湊找到這樣的值,並且他們知道他們沒有使用 $ N_B $ 除了生成步驟 2 的消息之外,他們有保證 $ A $ 參與了協議。

如果這個推理是正確的,步驟 3 可以簡化為 $ A\rightarrow B:\ hash(N_B) $ . 如果不是,我想知道為什麼!這不應被解釋為進行這種簡化的建議:在雜湊中包含身份只會有所幫助,而且我隱約看到它可以阻止對協議的一些故意更改,但不會像我重申的那樣破壞安全保證它。


問題中未說明的部分假設列表

  • 後期添加:在協議啟動之前,公鑰是已知且可信的。

  • 後期添加:密碼對IND-CCA2是安全的。因為我不確定我們是否可以用較小的財產逃脫,我寧願在安全方面犯錯。

  • 正如協議分析中經常未說明的那樣,消息的接收者

    • 嘗試解密並在失敗時中止(就像許多 IND-CCA2 密碼的解密一樣)
    • 根據為其生成概述的約定解析解密的消息,如果失敗則中止
    • 如果從上一步知道或以其他方式可計算(如在 $ B $ 邊)並在不匹配時中止。似乎沒有必要在恆定時間進行這種比較。
    • 或/和在接下來的步驟中為具有相同名稱的變數重用所述值。
  • 在加密消息的明文中,逗號符號表示一種連接形式,規定從結果中仍然可以在發生連接的點處拆分,例如,因為連接的兩個消息之一具有固定大小。對於步驟 3 中散列的消息中使用的逗號符號,這似乎沒有必要。

  • 在消息中, $ A $ 和 $ B $ 是同名參與者的身份。

  • 實體僅將其私鑰用於解密他們收到的消息。

  • 在第 1 步之後, $ B $ 根據第二部分決定他們在步驟 2 中使用哪個公鑰進行加密,以及在該步驟中向哪個收件人發送 $ A $ 步驟 1 的解密消息,如果他們不知道相應的公鑰,則中止。正如他們所說,他們檢查第二部分是否不是他們自己的身份,這對於協議的安全性是沒有必要的。

  • 如果參與者嘗試多個同時連接,就像伺服器通常做的那樣,假設他們為每個協議實例保留單獨的變數。我看不出一個實體參與的多次連接嘗試可能處於不同的方向是不行的。

  • 我忽略了尚未討論的側通道、故障攻擊和實施錯誤。

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