securityoverridehacking challenge 解題思路彙總——Decryption

繼Javascript的挑戰(securityoverridehackingchallenge 解題思路彙總——JavaScript)之後,今天來進行解密的訓練。加密算法在安全領域中有着重大的意義,它是很多安全設計的前提保障,因此許多加密算法都以官方的形式被公佈出來,並被廣泛使用。不過針對加密算法的攻擊屬於研究性質的工作,不論加密算法或者破解加密算法的方法已經提出,基本不會有太大變動。實際攻擊中,要麼是利用加密算法的已知缺陷進行攻擊,要麼就是想辦法尋找祕鑰或者暴力破解。

對於自定義的加密算法,則需要具體情況具體分析,利用當前條件進行判斷。理論上來說,加密算法的攻擊情況分爲以下四種。(加密算法默認爲公開,在實際情況中,往往自定義的加密算法也無法獲取,只能通過其他手段進行推測)

  • 已知明文:攻擊者只知道加密算法。
  • 已知密文:攻擊者知道加密算法和一部分明密文對。
  • 選擇明文:攻擊者知道加密算法,且可以向發送任意明文給加密機加密並獲得密文(但是不知道祕鑰)。
  • 選擇密文:攻擊者既可以選擇明文,也可以發送任意密文(除了需要解密的目標密文)給解密機解密並獲得明文。

這四種情況的難度依次降低,也是衡量一個加密算法的標準。在密碼學中,也給出來論證安全性的方法。這個內容涉及到的層次較深,這裏就不做具體介紹了,有興趣的可以自行了解。總得來說,瞭解密碼學也是瞭解安全的一個基礎,應當被每一位安全研究人員所熟知。

在SecuriytOverride中,這一系列的解密題並不困難,其重點更偏重於對加密以及哈希算法的介紹,同時也演示了一些糟糕的自定義加密方案。

5        Decryption

5.1       ROT13

ROT13算是一種公開的加密算法了,其字母對換表只有一種,因此實際上不具備加密功能。通常情況下用於使得某些文字不讓小白用戶明白。題目裏也說了,它是一種經典的弱祕鑰。

5.2       Base64

Base64屬於編碼而非加密。Base64能將任意的數據轉換爲基本的符號(26個字母大小寫,10個數字,+和/符號),從而避免特殊字符或者編碼問題導致接收方無法正確處理。解密工具網上很多,大部分的編程語言都自帶這個編碼和解碼庫。

5.3       Binary

二進制屬於機器語言。在實際編程使用中,通常情況下使用ascii表做對應關係。使用python進行轉換的方法查了一下(當然,你也可以手動分割,然後一個字母一個字母的來):

>>>import binascii
>>>bin(int(binascii.hexlify('hello'), 16))
'0b110100001100101011011000110110001101111'
In reverse:

>>>n = int('0b110100001100101011011000110110001101111', 2)
>>>binascii.unhexlify('%x' % n)
'hello'

In Python 3.2+:

>>>bin(int.from_bytes('hello'.encode(), 'big'))
'0b110100001100101011011000110110001101111'

In reverse:

>>>n = int('0b110100001100101011011000110110001101111', 2)
>>>n.to_bytes((n.bit_length() + 7) // 8, 'big').decode()
'hello'

5.4       LM Hash

破解Hash的算法很多,大多都是基於字典,彩虹表,以及一些隨機算法等等。可以嘗試尋找online的破解器(不過LM似乎比較冷門,大都不支持)。最直接的辦法還是用John The Ripper,linux下最熱門的密碼破解器了。

將密文寫入文件保存爲password,然後運行”john password”,提示破解成功。接着執行”john password --show”,結果如下:

其中0125450爲破解成功的明文,前面的?:是用來標識的(password文件內容應當爲user:password,這裏因爲前面省去了,所以出來了問好)。

5.5       MD5 Hash

這題我是一邊跑JohnThe Ripper,一邊在google破解器,在搜了10多個後終於出來了一個結果。破解Hash這種事,還是得拼祕鑰庫或者彩虹表的大小的。

MD5屬於經典的加密算法。不過目前已經有兩種攻擊方式被提出來:長度擴展攻擊和衝突攻擊。

長度擴展攻擊:即利用Merkle–Damgard架構(分塊加密,前一塊的結果的後一塊的祕鑰)的設計缺陷,可以在不知道祕鑰的情況下,對傳輸過程校驗值MAC進行計算,從而被修改明文信息可以通過驗證。當然,這種攻擊可以利用的場景比較有限。

衝突攻擊:目前已經可以利用工具快速的生成兩端MD5值相同的文件(文件內容可指定任意前綴和後綴),因此MD5的校驗性質不能得到保障。

5.6       SHA1 Hash

直接google哈希值,結果就出來了,運氣比較不錯。

5.7       Custom Encryption

自定義的加密方案,不過給出了加密方法,算是選擇明文攻擊了。嘗試加密,’a’=’/’,’aa’=’/f’,’aaa’=’/f/’。這樣加密方式就很清楚了,根據單雙位進行ascii上下偏移的替換,偏移量爲5。解密的話,倒過來就行了。

5.8       XOR Encryption + BASE64

稍加研究就可以發現,這題的加密算法是先進行異或,然後進行base64編碼。異或的話,只要執行兩次相同祕鑰的加密就可以了。因此,這題其實比較簡單,只需要將密文先base64解碼,再放到加密方法中加密一次,再base64解碼就可以了。

但是很蛋疼的是,第一次解碼的過程中出現了non-ascii碼的字符,即第一次解碼的內容無法輸入到加密方法中(大概可以用Javascript編碼解決問題?)。這裏我先輸入AAAAAAAA進行加密,然後獲取密文,異或得到祕鑰(執行base64解碼的過程中,保證輸出爲16進制文件)。得到祕鑰就好辦了,直接解密就好。需要保證以上操作全部當做int處理,最後再轉回字符串,不然會出現麻煩。

5.9       Advanced Custom Encryption

一個更復雜的自定義加密方法,同樣是選擇明文攻擊。初步嘗試可得出以下表格:

a

955128

aa

9551289409128

b

970128

bb

9701289604128

ab

9551289604128

ba

9701289409128

aaa

9551289409128955128

ccc

9851289801128985128

ddd

1000128100001281000128

eee

1015128102011281015128 

 

可以看出,這個加密都是以128作爲結尾,單雙位存在差異,但是不對其他位產生影響。從數字大小上來看,是按照ASCII順序進行排列的。經過更多的嘗試,發現字符與字符之間的偏差是不固定的,因此無法得出一個統一的規定的來。不過還好只是單個字符轉換,可以一個個試着來,試的時候注意單雙位的偏差即可。

 

發佈了33 篇原創文章 · 獲贊 43 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章