Cryptanalysis

是ab+e反對磷一個b+和反對磷a b + e mod P很難反轉?

  • July 31, 2017

給定 $ a, p $ , $ c $ 在哪裡 $ c = a b + e \mod p $ , 能夠 $ e $ 能恢復嗎?

額外細節:

  • $ p $ 是素數
  • $ a, p $ 在問題的許多實例中重複使用
  • $ b, e $ (並通過擴展 $ c $ ) 對於問題的每個實例總是唯一的
  • $ a, p $ 大約 783 位,與 $ a $ 那時變小 $ p $ 不超過幾位
  • $ b, e $ 是均勻隨機的 256 位整數

我試過的:

  • 如果問題沒有做模 $ p $ ,但是超過整數,那麼執行起來就很簡單了 $ c \mod b $ 獲得 $ e $ .
  • 的模逆 $ a $ 大小與 $ a $ , 否則我們可以做 $ a_i c \equiv b + a_i e \mod p $ 其次是 $ \mod p_i $ 恢復 $ b $ .
  • 我注意到:

p - b(p - a) \mod p

$ a b \equiv p - b(p - a) \mod p $ 這讓我想到了這個小算法:

$ x = p - a\ b = c / x\ e = c \mod x\ y = x q + e \mod p\ y \equiv c\ y = c - e - 1\ b = (y * inverse(a, p)) \mod N\ output\ b, e $

但無論出於何種原因,這似乎只在 $ p=65537 $ 和 $ a=256 $ .

  • 將上述算法應用於 $ a $ 對於實際 $ p $ 不輸出 $ b, e $ 正確。
  • 如果 $ b, e $ 大小相同 $ a $ ,我很確定這在理論上是安全的。
  • 自從 $ b, e $ 更小,這讓我覺得不知何故有洩漏。
  • 自從 $ a b \mod p $ 大小約為 783 位, $ e $ 大小只有大約 256 位,然後大部分的高位 $ a b + e \mod p $ 等於的高位 $ p q \mod p $ .我不知道如何利用這些資訊。

答案可能顯然很簡單,但我只是無法弄清楚幾個星期。

這是我試圖打破的python程式碼的要點。

背景: $ ab + e \bmod P $ 是我正在研究的陷門函式的公鑰操作。相同的表達式,通常具有更多項/更高維度,在許多基於格的密碼系統中非常普遍。

我的工作可以在 github 上找到,因此我碰巧從那裡的另一個使用者那裡收到了一些分析。以下是使用者評論的轉錄。

這裡給出的“EPQ”密鑰交換程序容易受到 Lagarias-Odlyzko 風格的格子攻擊。通常的上三角格基矩陣是通過取一個單位矩陣並將最右邊的列替換為由公鑰、系統參數和密文組成的向量來形成的。這個 3 維點陣包含一個暴露明文的短向量,允許我們使用 SVP 預言機恢復它。

我已經使用 fpLLL 作為 SVP oracle 對攻擊進行了實驗驗證,並且在每次試驗中都成功地恢復了密鑰。為了具體和方便,我使用的格基是(其中 P 是系統模數,K 是公鑰,C 是密文):

$ \begin{pmatrix} 1 & 0 & P \ 0 & 1 & K \ 0 & 0 & C \end{pmatrix} $

我實際上在命令行上使用了 vanilla fpLLL,並手動輸入程序生成的數字。為了展示,我剛才生成了這個密鑰對:

上市:914984079037409997753646956896411367020716296641338957641608068567317657086975832590795630339277510788727851945111403187181412830140879040014025475367233381190196941804342169193880920240279264797993403702890997094738006766532630568999

私人的:2502644320274784300686027905786577204651695824856428916800576785188468831099194056968432976701679611038222704877942453351051289674522482331865454722815092306

並加密一個隨機密鑰得到這個密文:(31156599101993645275226400017248608173867507193910625562695392661378570296553738808446028840212848623662312900007512235634449530713883849145685393866636831069585880990434485646285032107701202733953935100342846543008476824530843873800801

隨機密鑰是101020355786439301914818388108389342468906297672328361246394394849844032365586:)

然後我手動將其輸入命令行(標誌 -a svp 告訴 fpLLL 充當 SVP oracle):

...:~\$ ~/codes/fplll/fplll/fplll -a svp

$ \begin{pmatrix} 1 & 0 & P_i \ 0 & 1 & K_i \ 0 & 0 & C_i \end{pmatrix} $

$$ values taken out of the matrix for readibility and horizontal space saving $$和 $ P_i= $ 90539821999601667010016498433538092350601848065509335050382778168697877622963864208930434463149476126948597274673237394102007067278620641565896411613073030816577188842779580374266789048335983054644275218968175557708746520394332802669663

和 $ K_i= $ 914984079037409997753646956896411367020716296641338957641608068567317657086975832590795630339277510788727851945111403187181412830140879040014025475367233381190196941804342169193880920240279264797993403702890997094738006766532630568999

和 $ C_i= $ 31156599101993645275226400017248608173867507193910625562695392661378570296553738808446028840212848623662312900007512235634449530713883849145685393866636831069585880990434485646285032107701202733953935100342846543008476824530843873800801 fpLLL 短向量輸出:

[203453603089198469384658317783196545918051882397653184390372945748471804449, -20132211511540947010614907531449286044959891949349819581130241666199997596098, 101020355786439301914818388108389342468906297672328361246394394849844032365586 ]

其形式為:[-modular_reduction_value, -s_value, plaintext]正確恢復明文101020355786439301914818388108389342468906297672328361246394394849844032365586以及加密期間使用的隨機 s 值。

至於阻止這種攻擊的參數,我發現如果 s 或 e 的大小增加了大約 16 位,則格開始包含許多不相關的短向量,但這會導致共享密鑰的低 16 位被破壞,並且這16位可以通過蠻力搜尋…

結論

如您所見,真正的問題似乎是“參數大小是多少 $ ab + e \bmod P $ 很難反轉?”,我們基本上碰巧在這裡有一個問題

然而,看起來為了真正量化它,我們必須知道密碼系統減少到什麼問題(如果有的話);然後,我們可以找出解決該問題的最有效算法是什麼以及它們如何擴展,並使用該資訊來選擇安全的參數大小。

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