CTF競賽進階 (一) 密碼學

single7_發表於2020-11-21

0x01 概述

Crypto 相比於 web 和 pwn,更考驗參賽者的基礎知識,對數學能力、邏輯思維能力與分析能力都有很高的要求。
密碼學題目多種多樣,包括但不限於:

  1. 通過密文分析明文
  2. 缺陷自定義密碼體制分析解密文
  3. 加/解密機互動介面,利用弱點來洩露某些敏感資訊

0x02 編碼

0x02a 概念

字元編碼(英語:Character encoding)、字集碼是把字符集中的字元編碼為指定集合中某一物件(例如:位元模式、自然數序列、8位組或者電脈衝),以便文字在計算機中儲存和通過通訊網路的傳遞。常見的例子包括將拉丁字母表編碼成摩斯電碼和ASCII。其中,ASCII將字母、數字和其它符號編號,並用7位元的二進位制來表示這個整數。通常會額外使用一個擴充的位元,以便於以1個位元組的方式儲存。

在計算機技術發展的早期,如ASCII(1963年)和EBCDIC(1964年)這樣的字符集逐漸成為標準。但這些字符集的侷限很快就變得明顯,於是人們開發了許多方法來擴充套件它們。對於支援包括東亞CJK字元家族在內的寫作系統的要求能支援更大量的字元,並且需要一種系統而不是臨時的方法實現這些字元的編碼。

0x02b Base encode

  1. Base64
    Base64 是一種基於 64 個可列印字元來表示二進位制資料的表示方法。每 6bit 為一個單元,對應一個可列印字元.
    base64 通常用於只能處理文字資料的場合,表示、傳輸、儲存一些二進位制資料,包括 MIME 電子郵件、XML 複雜資料等。
    tips:
    原資料長度不是 3 的倍數且剩下 1 個輸入資料,則在編碼結果後面加 2 個“=”;
    剩下 2 個輸入資料,則在編碼結果後面加 1 個“=”;
    是 3 的倍數則一個“=”也不加。

  2. base32 and base16
    與 base64 目的一樣,只是具體編碼規則不同。
    base32 編碼將二進位制檔案轉換成 32 個 ASCII 字元組成的文字
    轉換表:
    ABCDEFGHIJKLMNOPQRSTUVWXYZ234567

base16 …
轉換表:
0-9
A-F

  1. uuencode
    uuencode這個名字是衍生自"Unix-to-Unix encoding",原先是 Unix 系統下將二進位制的資料藉由 uucp 郵件系統傳輸的一個編碼程式,是一種二進位制到文字的編碼。uudecode 是與uuencode 搭配的解碼程式,uuencode/decode 常見於電子郵件中的檔案傳送以及 usenet 新聞組和 BBS 的貼文等等。近來已被 MIME 所大量取代。
  2. xxencode
    類似 BASE64 ,轉換表不同
    XXencode 編碼,XX編碼介紹、XXencode編碼轉換原理與演算法

0x02c 其他編碼

  1. URL encode
    百分號編碼(英語:Percent-encoding),又稱:URL編碼(URL encoding)是特定上下文的統一資源定位符 (URL)的編碼機制,實際上也適用於統一資源標誌符(URI)的編碼。也用於為 application/x-www-form-urlencoded MIME準備資料,因為它用於通過HTTP的請求操作(request)提交HTML表單資料。
  2. jjencode and aaencode
    jjencode 和 aaencode 都是針對 JavaScript 程式碼的編碼方式。前者是將 JS 程式碼轉換成只有符號的字串,後者是將 JS 程式碼轉換成常用的網路表情。本質上適對 JS 程式碼的一種混淆。

0x03 古典密碼

0x03a 線性對映

  1. 凱撒密碼
    凱撒密碼(英語:Caesar cipher),或稱凱撒加密、凱撒變換、變換加密,是一種最簡單且最廣為人知的加密技術。凱撒密碼是一種替換加密技術,明文中的所有字母都在字母表上向後(或向前)按照一個固定數目進行偏移後被替換成密文。例如,當偏移量是3的時候,所有的字母A將被替換成D,B變成E,以此類推。這個加密方法是以羅馬共和時期凱撒的名字命名的,據稱當年凱撒曾用此方法與其將軍們進行聯絡。
    凱撒密碼通常被作為其他更復雜的加密方法中的一個步驟,例如維吉尼亞密碼。凱撒密碼還在現代的ROT13系統中被應用。但是和所有的利用字母表進行替換的加密技術一樣,凱撒密碼非常容易被破解,而且在實際應用中也無法保證通訊安全。
    在這裡插入圖片描述
  2. 維吉尼亞密碼

維吉尼亞密碼(又譯維熱納爾密碼)是使用一系列凱撒密碼組成密碼字母表的加密演算法,屬於多表密碼的一種簡單形式。

維吉尼亞密碼曾多次被發明。該方法最早記錄在吉奧萬·巴蒂斯塔·貝拉索( Giovan Battista Bellaso)於1553年所著的書《吉奧萬·巴蒂斯塔·貝拉索先生的密碼》(義大利語:La cifra del. Sig. Giovan Battista Bellaso)中。然而,後來在19世紀時被誤傳為是法國外交官布萊斯·德·維吉尼亞(Blaise De Vigenère)所創造,因此現在被稱為“維吉尼亞密碼”。

維吉尼亞密碼以其簡單易用而著稱,同時初學者通常難以破解,因而又被稱為“不可破譯的密碼”(法語:le chiffre indéchiffrable)。這也讓很多人使用維吉尼亞密碼來加密的目的就是為了將其破解
用來加密解密的維吉尼亞表格

0x03b 固定替換

  1. 培根密碼
    培根密碼,又名倍康尼密碼[1](英語:Bacon’s cipher)是由法蘭西斯·培根發明的一種隱寫術。
  2. 豬圈密碼
    豬圈密碼(英語:pigpen cipher),亦稱共濟會密碼(masonic cipher)或 共濟會員密碼(Freemason’s cipher),是一種以格子為基礎的簡單替代式密碼。即使使用符號,也不會影響密碼分析,亦可用在其它替代式的方法。右邊的例子,是把字母填進格子的模樣。
    早在1700年代,共濟會常常使用這種密碼保護一些私密紀錄或用來通訊,所以又稱共濟會密碼。
    上圖,是豬圈密碼用符號與26個字母作的密碼配對。

0x03c 移位密碼

  1. 柵欄密碼
    柵欄密碼是一種置換式密碼。其名稱來自其加密方法。所謂柵欄密碼,就是將要加密的明文分為N個一組,再從每組的選出一個字母連起來,形成一段無規律的密文。
    柵欄密碼並非一種強的加密法,其加密原理限制了金鑰的最高數量不可能超過明文字母數,而實際加密時金鑰數目更少,因此有些密碼分析員甚至能用手直接解出明文。
  2. 曲路密碼
    曲路密碼是一種置換密碼,其中金鑰是從明文建立的塊中讀取密文時要遵循的路徑,該金鑰需雙方事先約定好(曲路路徑)。
    在這裡插入圖片描述

0x04 分組密碼

0x04a 分組密碼常見工作模式

  1. ECB
    ECB模式(電子密碼本模式)
    ECB模式是將明文訊息分成固定大小的分組,當最後一個分組的內容小於分組長度時,需要用特定的資料進行填充以至於長度等於分組長度,每個分組的加密和解密都是獨立的,可以進行並行操作,但是安全性較低,對於相同的明文會被加密成相同的密文,因此不能很好的保護資料模式。在這裡插入圖片描述
  2. CBC模式(密碼分組連結模式)
    CBC模式中的第一個分組需要用初始化向量IV(一個隨機的且長度為一個分組長度的位元序列)進行異或操作再進行加密,而後面的每一個分組都要先和前一個分組加密後的密文分組進行異或操作,然後再加密。加密是連續的,不能進行並行操作。在這裡插入圖片描述
  3. OFB模式(輸出反饋模式)
    OFB模式是通過將明文分組和密碼演算法的輸出進行異或操作來產生密文分組的,也需要使用初始化向量(IV),可以將塊密碼變成同步的流密碼,將之前一次的加密結果使用金鑰再次進行加密,產生的塊作為金鑰流,然後將其與明文塊進行異或,得到密文。由於 XOR 操作的堆成性,加密和解密操作是完全相同的。
    在這裡插入圖片描述
  4. CFB模式(密文反饋模式)
    CFB模式類似OFB模式,是將前一個分組的密文加密後和當前分組的明文進行異或操作生成當前分組的密文,第一個明文分組通過初始化向量lV進行加密再與之進行異或操作得到第一個密文分組。
    在這裡插入圖片描述
    在這裡插入圖片描述
  5. CTR模式(計數器模式)
    CTR 模式也被稱為 ICM 模式、SIC 模式。在 CTR 模式中,每次加密時都會生成一個不同的值來作為計數器的初始值,每個分組對應一個逐次累加的計數器,通過對計數器進行加密來生成金鑰流,再將金鑰流與明文分組進行異或操作得到密文分組。
    在這裡插入圖片描述
    在這裡插入圖片描述

0x04b 費斯妥密碼和 DES

  1. 費斯妥密碼
    在密碼學中,費斯妥密碼(英語:Feistel cipher)是用於構造分組密碼的對稱結構,以德國出生的物理學家和密碼學家霍斯特·費斯妥(Horst Feistel)命名,他在美國IBM工作期間完成了此項開拓性研究。通常也稱為費斯妥網路(Feistel network)。大部分分組密碼使用該方案,包括資料加密標準(DES)。費斯妥結構的優點在於加密和解密操作非常相似,在某些情況下甚至是相同的,只需要逆轉金鑰編排。因此,實現這種密碼所需的程式碼或電路大小能幾乎減半。
    費斯妥網路是一種迭代密碼,其中的內部函式稱為輪函式。
  2. DES 密碼
    資料加密標準(英語:Data Encryption Standard,縮寫為 DES)是一種對稱金鑰加密塊密碼演算法,1976 年被美國聯邦政府的國家標準局確定為聯邦資料處理標準(FIPS),隨後在國際上廣泛流傳開來。它基於使用56位金鑰的對稱演算法。這個演算法因為包含一些機密設計元素,相對短的金鑰長度以及懷疑內含美國國家安全域性(NSA)的後門而在開始時有爭議,DES 因此受到了強烈的學院派式的審查,並以此推動了現代的塊密碼及其密碼分析的發展。
    DES 現在已經不是一種安全的加密方法,主要因為它使用的 56 位金鑰過短。1999年1月,distributed.net 與電子前哨基金會合作,在 22 小時 15 分鐘內即公開破解了一個 DES 金鑰。也有一些分析報告提出了該演算法的理論上的弱點,雖然在實際中難以應用。為了提供實用所需的安全性,可以使用 DES 的派生演算法 3DES 來進行加密,雖然 3DES 也存在理論上的攻擊方法。DES 標準和 3DES 標準已逐漸被高階加密標準(AES)所取代。另外,DES 已經不再作為國家標準科技協會(前國家標準局)的一個標準。
    在某些文獻中,作為演算法的 DES 被稱為 DEA(Data Encryption Algorithm,資料加密演算法),以與作為標準的 DES 區分開來。在發音時,DES 可以作為縮寫按字母拼出來(/ˌdiːˌiːˈɛs/),或作為一個詞念成/ˈdɛz/。
    初始置換 -> subkeys 的生成 -> 輪函式
  3. AES
    高階加密標準(英語:Advanced Encryption Standard,縮寫:AES),又稱Rijndael加密法(荷蘭語發音:[ˈrɛindaːl],音似英文的“Rhine doll”),是美國聯邦政府採用的一種區塊加密標準。這個標準用來替代原先的DES,已經被多方分析且廣為全世界所使用。經過五年的甄選流程,高階加密標準由美國國家標準與技術研究院(NIST)於2001年11月26日釋出於FIPS PUB 197,並在2002年5月26日成為有效的標準。現在,高階加密標準已然成為對稱金鑰加密中最流行的演算法之一。
    該演算法為比利時密碼學家Joan Daemen和Vincent Rijmen所設計,結合兩位作者的名字,以Rijndael為名投稿高階加密標準的甄選流程。

0x05 流密碼

在密碼學中,流密碼(英語:Stream cipher),又譯為流加密、資料流加密,是一種對稱加密演算法,加密和解密雙方使用相同偽隨機加密資料流(pseudo-random stream)作為金鑰,明文資料每次與金鑰資料流順次對應加密,得到密文資料流。實踐中資料通常是一個位(bit)並用異或(xor)操作加密。

該演算法解決了對稱加密完善保密性(perfect secrecy)的實際操作困難。“完善保密性”由克勞德·夏農於1949年提出。由於完善保密性要求金鑰長度不短於明文長度,故而實際操作存在困難,改由較短資料流通過特定演算法得到金鑰流。

0x06 公鑰密碼

0x06a 概述

公開金鑰密碼學(英語:Public-key cryptography)也稱非對稱式密碼學(英語:Asymmetric cryptography)是密碼學的一種演算法,它需要兩個金鑰,一個是公開金鑰,另一個是私有金鑰;公鑰用作加密,私鑰則用作解密。使用公鑰把明文加密後所得的密文,只能用相對應的私鑰才能解密並得到原本的明文,最初用來加密的公鑰不能用作解密。由於加密和解密需要兩個不同的金鑰,故被稱為非對稱加密;不同於加密和解密都使用同一個金鑰的對稱加密。公鑰可以公開,可任意向外發布;私鑰不可以公開,必須由使用者自行嚴格祕密保管,絕不透過任何途徑向任何人提供,也不會透露給被信任的要通訊的另一方。

基於公開金鑰加密的特性,它還能提供數字簽名的功能,使電子檔案可以得到如同在紙本檔案上親筆簽署的效果。

公開金鑰基礎建設透過信任數字證照認證機構的根證照、及其使用公開金鑰加密作數字簽名核發的公開金鑰認證,形成信任鏈架構,已在TLS實現並在全球資訊網的HTTP以HTTPS、在電子郵件的SMTP以SMTPS或STARTTLS引入。

另一方面,信任網路則採用去中心化的概念,取代了依賴數字證照認證機構的公鑰基礎設施,因為每一張電子證照在信任鏈中最終只由一個根證照授權信任,信任網路的公鑰則可以累積多個使用者的信任。PGP就是其中一個例子。

0x06b RSA

RSA加密演算法是一種非對稱加密演算法,在公開金鑰加密和電子商業中被廣泛使用。RSA是由羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Shamir)和倫納德·阿德曼(Leonard Adleman)在1977年一起提出的。當時他們三人都在麻省理工學院工作。RSA 就是他們三人姓氏開頭字母拼在一起組成的。

1973年,在英國政府通訊總部工作的數學家克利福德·柯克斯(Clifford Cocks)在一個內部檔案中提出了一個與之等效的演算法,但該演算法被列入機密,直到1997年才得到公開。

對極大整數做因數分解的難度決定了 RSA 演算法的可靠性。換言之,對一極大整數做因數分解愈困難,RSA 演算法愈可靠。假如有人找到一種快速因數分解的演算法的話,那麼用 RSA 加密的資訊的可靠性就會極度下降。但找到這樣的演算法的可能性是非常小的。今天只有短的 RSA 鑰匙才可能被強力方式破解。到目前為止,世界上還沒有任何可靠的攻擊RSA演算法的方式。只要其鑰匙的長度足夠長,用RSA加密的資訊實際上是不能被破解的。

1983年9月12日麻省理工學院在美國為RSA演算法申請了專利。這個專利於2000年9月21日失效。由於該演算法在申請專利前就已經被發表了,在世界上大多數其它地區這個專利權不被承認。

0x07 其他常見密碼學應用

0x07a Diffle-Hellman 金鑰交換

迪菲-赫爾曼金鑰交換(英語:Diffie–Hellman key exchange,縮寫為D-H) 是一種安全協議。它可以讓雙方在完全沒有對方任何預先資訊的條件下通過不安全通道建立起一個金鑰。這個金鑰可以在後續的通訊中作為對稱金鑰來加密通訊內容。公鑰交換的概念最早由瑞夫·墨克(Ralph C. Merkle)提出,而這個金鑰交換方法,由惠特菲爾德·迪菲(Bailey Whitfield Diffie)和馬丁·赫爾曼(Martin Edward Hellman)在1976年首次發表。馬丁·赫爾曼曾主張這個金鑰交換方法,應被稱為迪菲-赫爾曼-墨克金鑰交換(英語:Diffie–Hellman–Merkle key exchange)。

0x07b Hash 長度擴充套件攻擊

在密碼學和電腦保安中,長度擴充套件攻擊(Length extension attacks)是指標對某些允許包含額外資訊的加密雜湊函式的攻擊手段。

該攻擊適用於在訊息與金鑰的長度已知的情形下,所有采取了 H(金鑰 ∥ 訊息) 此類構造的雜湊函式。MD5和SHA-1等基於Merkle–Damgård構造的演算法均對此類攻擊顯示出脆弱性。注意,由於金鑰雜湊訊息認證碼(HMAC)並未採取 H(金鑰 ∥ 訊息) 的構造方式,因此不會受到此類攻擊的影響(如HMAC-MD5、HMAC-SHA1)。SHA-3演算法對此攻擊免疫。

0x07c Shamir 門限方案

Shamir (t,n)門限方案是通過構造一個t-1次多項式,並將需共享的祕密作為該多項式的常數項,將祕密分成n部分分別給n個參與者,使t個參與者聯合可恢復祕密,但少於t個參與者聯合不能得到共享祕密的任何資訊。Blakley獨立地提出的另一個(t,n)門限方案,它的基本思想是利用多維空間中的點來建立門限方案,將共享的祕密看成t維空間中的一個點,每個子祕密為包含這個點的t-1維超平面的方程,任意t個t- 1維超平面的交點剛好確定共享的祕密,而t-1個子祕密(即t-1個t-1維超平面)僅能確定其交線,因而得不到共享祕密的任何資訊。

相關文章