護網杯一道密碼學的感想

2022-07-03 15:36:12 字數 2652 閱讀 5544

護網杯比賽,一道不算難的密碼學卻思路繞了好久才和出題人相符合,這裡記錄一下做題的過程及感想

題目的原始碼如下:

import

osdef

xor(a,b):

assert len(a)==len(b)

c=""

for i in

range(len(a)):

c+=chr(ord(a[i])^ord(b[i]))

return

cdef

f(x,k):

return xor(xor(x,k),7)

defround(m,k):

l=m[0:27]

r=m[27:54]

new_l=r

new_r=xor(xor(r,l),k)

return new_l+new_r

deffez(m,k):

for i in

k: m=round(m,i)

returnmk=

for i in range(7):

m=open("

flag

","rb

").read()

assert len(m)<54m+=os.urandom(54-len(m))

test=os.urandom(54)

print test.encode("

hex"

)print fez(test,k).encode("

hex"

)print fez(m,k).encode("

hex")

除了原始碼,還給了三行16進製制的數,看到這道題目時,首先分析一下題目,給了乙個k盒子,用於加密過程使用,k是乙個由7個隨機字串產生的。其中m變數的前面一部分包含著flag,test變數也是一串隨機的字串

加密函式最外層是fez,然後fez中迴圈呼叫round函式進行加密,每一次迴圈都是使用k盒子中的乙個隨機字串,其中round是真正實現加密的過程,是乙個異或的過程,異或是將傳入的明文的兩部分還有乙個k作為變數。

第一種思路:剛開始的時候,一看到urandom,便想到是不是偽隨機數,但是google了一段時間發現urandom算是乙個強偽隨機數,還是比較安全的,而且就算我知道隨機數種子,對於我前面解flag也沒有幫助,還得靠暴力破解,應該不是出題人想要考的,所以這條路是行不通的,主要是以往在比賽中做的一些題目很多用到了暴力破解,所以看到密碼學形成了一種思維定式,就想看看能不能結合暴力破解來解題。。。。唉

第二種思路:因為test是已知的,第一次fez的呼叫中用到了test和k,並且密文也是已知的,那麼能不能解出來k,然後去解flag?於是回到round函式,可以看到最後一次加密結束時,用到的是k7,那麼最後一次的e_l和e_r我們是知道的,我們能不能推出前一次的l和r,也就是沒有經過輪加密的l和r,我們已經知道下一輪的密文l等於上一輪的r,下一輪的r等於上一輪的r異或l再異或當前輪所使用的k,那麼很容易得出我們能獲得上一輪所使用的明文的右半部分,有了上一輪的右半部分,加密後的新的右半部分,如果我們求出上一輪的左邊的部分,就能求出當前輪所使用的k,但是根絕目前已知的所有條件,上一輪的明文的左半部分是無法求出的,卡在這裡了很長時間,結果無奈放棄了

第三種思路:正向來模擬加密的過程,來發現是否存在漏洞,在round函式中,新一輪的左半部分等於上一輪的右半部分,下一輪的右半部分等於上一輪的左右兩部分異或之後再和當前輪的k異或,產生的新一輪的左右兩部分拼接成為新的密文。

即假設初始明文為m,分為l和r兩部分

1 第一輪:r+r^l^k1

2 第二輪:r^l^k1+r^r^l^k1=>r^l^k1+l^k1^k2

3 第三輪:l^k1^k2+r^k2^k3

4 第四輪:r^k2^k3+l^r^k1^k3^k4

5 第五輪:l^r^k1^k3^k4+l^k1^k2^k4^k5

6 第六輪:l^k1^k2^k4^k5+r^k2^k3^k5^k6

7 第七輪:r^k2^k3^k5^k6+r^l^k1^k3^k4^k6^k7

由最終的形式可以看到,結果由k盒子和初始的明文的兩部分組成  

又因為在包含flag的m變數中進行了相同的fez函式加密,所以和test呼叫fez函式以後的結果形式是相同的,只是初始的明文不同,又因為根據異或運算的計算邏輯,相同的數異或為0,0異或任何數還是其本身,所i有即使我們不知道k盒子,因為兩次運算結果的k盒子在結果中的形式相同,所以可以抵消掉。

因此解為兩部分:

1.第七輪結束後的密文的左半部分異或後實際就是test變數的右半部分和flag的右半部分進行了一次異或,再和test本身的右半部分異或一次,就能得到m變數的右半部分。

2.第七輪結束後的密文的左右兩部分異或得到只剩下原明文左半部分和k盒組成的結果,即兩次fez加密的結果的各自的左右兩部分先做異或運算,然後再把兩組異或結果再一起異或一次,即為test變數的左半部分和m變數的左半部分異或的結果,又因為test變數已知,所以把結果再和test變數的左半部分異或一次就能得到m的左半部分。

經過以上兩步,就能得到明文m,又因為m中包含了flag,所以我們就解出了答案。

還是自己不懂套路,k盒屬於中間變數,並且加密為異或加密,更何況這是已知密文的攻擊,呼叫了兩次相同的加密方式,使用的k盒也是相同的,所以才產生了這樣的漏洞,下次分析題目2條路:

1.先正向分析加密流程,分析加密後的結果組成,能不用暴力解決就不要用

2.逆向分析,從後往前推

乙個簡單的密碼學例項

乙個簡單的密碼學例項 分享乙個密碼學例項 假設我們的主角是alice和bob,他們準備一同出去吃飯,但就去哪家餐廳並沒有達成共識。此時通常的解決方法是猜拳 投硬幣之類的手段來決定選擇誰的方案。通常這種方式也算公平 合理,就像足球場上的擲幣一樣 概率是一半一半 而此時我們需要的是一種協議,這個協議可以...

我學python的第一道題目

這是一道非常簡單但卻十分有意義的題目,它是我學python的開端。當時我正在圖書館奮力學習 偷偷打遊戲 突然電腦qq頭像跳動,是乙個女生問我一道python題目,沒錯就是這道題目。可是我雖然是學計算機的,但我沒學過python,只學了計算機導論 就是一本介紹計算機發展史和一些理論的教材 然後我花了乙...

密碼學的一些基本概念

密碼學是研究如何隱密地傳遞資訊的學科。機密性 是網路資訊不洩露給非授權使用者的特性,防止被動攻擊。常用的保密技術包括 防偵聽 防輻射 資訊加密 物理保密等 完整性.完整性是網路資訊未經授權不能進行改變的特性。完整性是一種面向資訊的安全性防止主動攻擊。不可否認性 用於防止通訊雙方中的某一 方 對所傳輸...