Cryptanalysis

什麼是推薦的,開始分組密碼設計和/或分析的一般策略?

  • May 1, 2019

我(以及其他許多人)一直對現代密碼學建構塊的內部工作原理著迷*:*分組密碼。

現在,關於設計和分析這些密碼的“黑魔法”的資源稀少;特別是對於入門級。Schneier 指南等可用資訊似乎有些過時(由於其年代久遠)。

開始設計和/或分析現代密碼塊密碼的“最佳”(閱讀:推薦)策略的普遍共識是什麼?


Nota bene:將其視為一個通用的、類似於 wiki 的問題——僅用於學習目的。(除此之外,當出現類似的算法設計問題時,這個問答將代表我們可以向人們指出的地方。)

為了設計和分析密碼,我們必須確定密碼應該完成什麼。簡而言之,我們希望能夠以一種只有獲得授權的人才能執行或反轉轉換的方式來轉換資訊。我們可以將這種轉換稱為“加密”。儘管如果有機會他們可以/將嘗試這樣做,但可能存在無法獲得任何受加密方法保護的資訊的未經授權方。即使所涉及的工作量很大,這一點也適用。我們可以將未經授權的各方稱為對手。

理想情況下,我們希望被授權方所需的相互資訊盡可能少,並且能夠以某種程度的便利獲得。如果不是因為這兩個極其實用的方面,One Time Pad 將是無與倫比的,具有資訊論安全性、實現簡單性和最大效率(每個字元只需添加一次!)。OTP 不是分組密碼,但它提供了一個很好的參考點來衡量。

不幸的是,一次性密碼本要求密鑰材料與要加密的資訊一樣長,並由授權方提前準備。這違反了我們上面列出的兩個實際願望,因此我們必須設計其他可以重用小得多的密鑰的算法。

一種誘惑是對加密算法本身保密。不幸的是,對算法保密意味著算法的所有使用者都知道加密/解密的秘密。隨著知道秘密的使用者數量的增加,秘密被對手洩露的可能性也在增加。這將達不到最初的設計目標,並且在實用性和要保護的機密大小方面僅比 OTP 稍微好一點。

這導致了第三個也是最成功的選擇:使用一種眾所周知的算法,該算法將所需的保密性集中到算法使用的密鑰中。

無論使用何種加密方法,資訊都可能受到攻擊者的攻擊。加密的工作是抵抗這種攻擊,並保護資訊。這意味著幾件事:

  • 由於現代密碼使用密鑰來授權各方執行轉換,因此攻擊者的目標是獲取密鑰

    • 獲得密鑰意味著能夠加密明文和解密密文,違背了密碼的最初設計目標

      • 類似於門上的鎖如何使用鑰匙
      • 你只需要保護鑰匙,而不是阻止任何人知道有鎖
      • 鑰匙是可重複使用的,並且具有很長的使用壽命。
      • 密鑰應該相對較小 - 128 到 256 位是常見的
    • 即使對手:密鑰也必須保持安全:

      • 擁有大量密文

      • 知道消息的明文內容,以及每條消息對應的密文

      • 可以欺騙授權方為對手加密/解密消息

        • 隨意選擇要加密或解密的消息。
        • 可以適應或修改未來的加密/解密查詢以響應過去的查詢。

現代密碼的大部分複雜性來自於保護密鑰的嘗試,進而保護明文。設計具有可重複使用密鑰的密碼需要了解密碼和密鑰可能受到攻擊的方式。為了設計密碼,你必須學會像對手一樣思考,並研究密碼是如何被破解的。

標準攻擊

任何新密碼都必須防範幾種通用攻擊方法:暴力搜尋、差分密碼分析和線性密碼分析。

  • 蠻力搜尋意味著對手簡單地猜測所有可能的鍵值組合,直到找到正確的鍵

    • 最壞情況時間複雜度為 $ 2^N $ , 在哪裡 $ N $ 是密鑰的寬度(以位為單位)

      • 僅當密鑰是均勻隨機的時,時間複雜度才是準確的
      • 對於現代電腦來說,64 位被認為太低了
      • 128 位目前被認為是安全的
      • 256 位被認為是永遠安全的,即使面對未來的量子電腦
  • 差分密碼分析利用特定差異( $ \Delta_1 $ ) 輸入之間 ( $ t_1 $ 和 $ t_1’ $ ) 將傳播到特定的輸出差異 ( $ \Delta_2 $ ) 在此處輸入圖像描述

    • 通過測試所有可能的輸入差異,可以返回具有一些輸出差異的機率。幾個具體的區別 $ \Delta_1 $ 和 $ \Delta_2 $ 被稱為微分並註明( $ \Delta_1 \Rightarrow \Delta_2 $ ).
    • 給定差值 ( $ \Delta \Rightarrow \Delta’ $ ) 成立,這種行為可以更有效地被利用來對抗密碼
    • 可以在這裡找到一個相對簡單的程式碼教程
    • Biham 和 Shamir 的原始論文可以在這裡找到
  • 線性密碼分析利用來自給定輸入的比特子部分與函式輸出中的比特子部分相關的機率

線性和差分密碼分析可以提供關於密碼的內部狀態可能是什麼的提示,直到某個點。這可以減少對手必須猜測的部分密鑰的可能值的數量。這些被認為是現代密碼密碼分析方面最強大的兩個工具。

分組密碼結構

密碼結構主要有兩類:Feistel 網路替換置換網路

Feistel 網路的基本設計是將消息塊分成兩半,一左一右。將具有良好擴散和混淆的鍵控函式應用於右半部分,並將其輸出添加到左半部分。然後交換兩半,並重複該過程。解密或多或少與使用反向密鑰執行的操作相同,因此這種結構在實現複雜性方面相對較輕。DES是 Feistel 網路的一個範例。針對 DES存在差分和線性攻擊

替代置換網路的設計通常比 Feistel 網路的左半部分和右半部分更細。例如,在Rijndael 密碼(也稱為高級加密標準 (AES))中,消息以 16 x 1 字節狀態進行操作,排列為 4 行和 4 列。它由 4 個主要步驟組成:字節替換、行轉置、mixColumns 步驟以及通過 XOR 添加密鑰材料。

許多(如果不是全部)現代分組密碼是由重複迭代相同的核心功能組成的,通常在每個應用程序之間使用多個不同的密鑰。通常,這些密鑰源自使用者實際提供給密碼的主密鑰。我們將這種方式生成的密鑰稱為輪密鑰,而生成它們的過程稱為密鑰調度。

導出輪密鑰的方式會影響密碼的安全性和效率。理想情況下,任何輪密鑰資訊的恢復應該盡可能少地透露其他輪密鑰或主密鑰。這是 OTP 的優勢之一:恢復一個字節的密鑰材料(即通過已知的明文攻擊)對恢復密鑰的任何其他字節沒有幫助。通常還認為快速生成輪密鑰材料是有益的,因為具有慢密鑰調度的密碼可能具有更大的延遲和/或更低的吞吐量。

設計圓函式

為了知道要使用什麼操作,我們需要知道我們需要完成什麼:

  • 擴散

    • 在任何地方翻轉一個輸入位應該平均翻轉(大約)一半的輸出位
    • 逐字節移位、旋轉和轉置有助於分散給定比特子部分的影響
    • 也可以使用按位轉置,但在軟體中可能相對較慢(但在硬體中可能很快)
  • 混亂/非線性

    • 密鑰和密文的關係應該是複雜的
    • 線性密碼可以通過高斯消元法破解
    • 不同領域的混合算術可以提供非線性(即異或和加法模256)
    • 布爾函式可以提供非線性
  • 只有使用正確的密鑰才能反轉

    • 如果在某個時候引入了秘密(密鑰)材料,密碼將只提供機密性。

      • 在應用任何輪之前和應用所有輪之後在輸入上應用一個鍵稱為鍵白化並且很常見
      • 此外,每 N 輪添加一個密鑰,其中 N 通常為 1(即每輪之後)
      • 密鑰加法通常通過 xor 和加法模 (2**wordsize_in_bits) 完成,或兩者兼而有之
    • 不應該有“弱鍵

因此,我們的目標是將消息與密鑰結合起來,並以擴散和非線性的方式翻轉大量位。理想情況下,我們希望我們的操作組合產生類似於隨機排列的輸出。

一些可用的說明是:

  • 異或

    • 用於組合兩個輸入(即消息和密鑰)

    • 是它自己的逆(對合)

      • 不需要減法指令來反轉
    • 位切片

    • 需要加法/布爾函式/s-box 查找非線性

  • 添加

    • 用於組合兩個輸入
    • 需要單獨的減法指令來反轉
    • 傾向於翻轉低位而不是高位
  • 查找表

    • 適用於良好的差分/線性特性
    • 有效地等效於非線性函式的記憶體輸入/輸出
    • 在使用記憶體的機器上可能容易受到定時攻擊
  • 布爾函式

    • 對非線性有用
    • 一些範例是選擇和多數功能
      • 選擇

        • 邏輯上,如果 C 則 B,否則 A
        • c ^ (a & (b ^ c)) (對於數學家: $ c\oplus(a\wedge(b\oplus c)) $ )
        • 位切片操作
      • 多數

        • (a & b) | (a & c) | (b & c) (對於數學家: $ (a\wedge b)\vee(a\wedge c)\vee(b\wedge c) $ )
  • 輪換/班次

  • 換位

    • 改變狀態詞的順序可以幫助提供擴散
    • 根據秘密數據轉置字節可能容易受到定時攻擊(依賴於秘密的記憶體訪問是問題)
    • 包括輪換
  • 組合的按位和按字節轉置:

    • 就像輸入位的混洗(排列)
    • 僅修改給定位的位置,而不是其值(不修改漢明權重)
    • 是線性變換
    • 範例:Keccak 排列,特別是 Rho 和 Pi 步驟
    • 可以提供“弱對齊”
  • 偽Hadamard變換

上述操作的一些範例組合:

  • Rijndael由消息上的 addRoundKey、mixColumns、shiftRows、subBytes 組成:

    • subBytes 是一個查找表(良好的差分/線性屬性)
    • shiftRows 是按字節轉置
    • mixColumns是一種線性變換,它與 shiftRows 一起提供擴散
    • addRoundKey xor 與狀態的鍵
  • DES輪函式由擴展置換、密鑰混合、s-box應用和比特置換組成

    • 擴展補償了從 6 位到 4 位的 S-box。
    • 每輪通過 xor 應用密鑰
    • S-box 可以抵抗差分密碼分析
    • 位排列提供擴散
  • 輪函式由密鑰混合 XOR、4×4 S-box 和線性變換組成

    • 每輪通過 xor 應用密鑰
    • S-box 並行應用(位切片設計)
    • 線性混合提供擴散
  • TEA僅使用加法、移位和異或:

    • xor/addition 創建非線性並應用關鍵材料
    • 班次/加法提供擴散

從一些例子中我們可以看出,似乎至少有兩種不同的方法:

  • 基於 S-box 的設計

    • 可以提供非常好的線性/微分特性和良好的性能

    • 由於巨大的搜尋空間,很難找到好的大型 s-box

    • 傾向於與線性混合層結合使用以進行擴散

    • Rijndael 策略

      • 使用具有最佳最壞情況差分/線性屬性的 s-box
      • 使用旨在增加擴散速率下限的混合層
      • 注意它是如何圍繞最壞的情況設計的
    • 可以提供清晰的抵抗差分/線性攻擊的證據

  • 基於ARX的設計(加法、旋轉、異或)

    • 與基於 s-box 的構造相比,本質上更不利於基於時序的側通道攻擊

      • 加法、異或和固定量旋轉通常是在恆定時間內實現的
    • PC 上的快速性能(特別是如果您可以避免記憶體訪問/堅持使用寄存器)

    • 緊湊/簡單的實現(不需要查找表所需的空間)

    • 與基於 s-box 的設計相比,對差分/線性攻擊的安全性分析沒有那麼簡單

許多密碼使用一組常量。每一輪,都會通過加法/異或向狀態引入一個新常量。這可以通過使連續回合不同來幫助抵抗滑動攻擊。

破輪函式

在將線性和/或差分密碼分析應用於任何新設計之前,請考慮執行一些統計測試。統計測試可以很快告訴您最新的設計是否完全損壞。請注意,統計測試不能確認設計是否在密碼學上是安全的,它只能確認設計是不安全的。

一些範例測試可能是:

  • 雪崩測試

    • 使用給定密鑰生成隨機數據塊(即加密遞增計數器)並測量連續輸出之間的漢明距離(測量數據的擴散)
    • 用不同的密鑰加密同一系列的連續值,並測量前一組隨機數據與新組之間的漢明距離(測量密鑰的擴散)
  • 隨機性檢驗

    • 使用密碼生成大量(>1MB)偽隨機數據(即通過加密遞增計數器)
    • 將數據傳遞到ent、dieharder 或 NIST 測試套件等工具

在您的設計和 os.urandom 上執行上述測試:理想情況下,這兩個結果應該是無法區分的。

在設計攻擊時,首先嘗試攻擊密碼的簡化(單?)輪版本。尋找設計中最薄弱的地方。嘗試針對FEAL進行練習,它有一個主要弱點,對於學習差分/線性密碼分析和滑動攻擊很有用。一些針對 DES 的攻擊可能有助於了解線性密碼分析和蠻力搜尋

一旦你掌握了這些,除了通用線性/差分密碼分析之外,實際上還有許多不同的攻擊你可以在這裡找到一些與密碼分析相關的軟體

數學和視覺化

如果您發現視覺化和圖表有幫助,您可能會對此頁面感興趣。如果您對數學不太了解,請嘗試學習一些符號。您想了解的大部分資訊將出現在科學研究論文中,並以數學語言編寫。

在閱讀論文和密碼分析/密碼設計時將證明有用的一些主題是:

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