CTF題目中XOR加密解法腳本

0x00:xor加密原理

簡單異或密碼(英語:simple XOR cipher)是密碼學中一種簡單的加密算法,它按照如下原則進行運算:
A {\displaystyle \oplus } \oplus 0 = A
A {\displaystyle \oplus } \oplus A = 0
(A {\displaystyle \oplus } \oplus B) {\displaystyle \oplus } \oplus C = A {\displaystyle \oplus } \oplus (B {\displaystyle \oplus } \oplus C)
(B {\displaystyle \oplus } \oplus A) {\displaystyle \oplus } \oplus A = B {\displaystyle \oplus } \oplus 0 = B
其中 {\displaystyle \oplus } \oplus 爲邏輯異或(XOR)運算的符號。按這種邏輯,文本串行的每個字符可以通過與給定的密鑰進行按位異或運算來加密。如果要解密,只需要將加密後的結果與密鑰再次進行按位異或運算即可。
例如,字符串“Wiki”(8位ASCII:01010111 01101001 01101011 01101001) 可以按如下的方式用密鑰11110011進行加密:
01010111 01101001 01101011 01101001
{\displaystyle \oplus } \oplus 11110011 11110011 11110011 11110011
= 10100100 10011010 10011000 10011010
此種加密方法類似對稱加密,故解密的方式如下:
10100100 10011010 10011000 10011010
{\displaystyle \oplus } \oplus 11110011 11110011 11110011 11110011
= 01010111 01101001 01101011 01101001
異或運算符常作爲更爲複雜的加密算法的組成部分。對於其本身來說,如果使用不斷重複的密鑰,利用頻率分析就可以破解這種簡單的異或密碼。如果消息的內容被猜出或知道,密鑰就會泄露。異或密碼值得使用的原因主要是其易於實現,而且計算成本小。簡單重複異或加密有時用於不需要特別安全的情況下來隱藏信息。
如果密鑰是隨機的(不重複),而且與消息長度相同,異或密碼就會更爲安全。當密鑰流由僞隨機數發生器生成時,結果就是流密碼。若密鑰是真正隨機的,結果就是一次性密碼本,這種密碼在理論上是不可破解的。
在這些密碼的任何部分中,密鑰運算符在已知明文攻擊下都是脆弱的,這是因爲明文 {\displaystyle \oplus } \oplus 密文 = 密鑰。

0x01:xor,python解密腳本

已知明文和密文:

m1 = open('密文.txt','rb').read()
m2 = open('明文.txt','rb').read()
mes = "".join(map(lambda item:chr(item[0]^item[1]),list(zip(m1,m2))))
print(mes)

1.明文密文都用二進制的方式讀取
2.對兩個數據進行按位異或
3.將異或的二進制轉換成字符串
4輸出字符串
map:

# 提供了兩個列表,對相同位置的列表數據進行相加
>>> map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])
[3, 7, 11, 15, 19]

lambad:作爲匿名函數存在,對其進行異或並且轉換爲字符串形式
zip:

>>>a = [1,2,3]
>>> b = [4,5,6]
>>> c = [4,5,6,7,8]
>>> zipped = zip(a,b)     # 返回一個對象
>>> zipped

list(zip()):

>>> list(zipped)  # list() 轉換爲列表#python3中轉化成列表使用list函數,python2默認返回列表
[(1, 4), (2, 5), (3, 6)]

0x02:python加密腳本

根據異或原理A xor B = C;
C xor B = A;

m1 = open('明文.txt','rb').read()
m2 = open('真實明文.txt','rb').read()
mes = "".join(map(lambda item:chr(item[0]^item[1]),list(zip(m1,m2))))
m3 = open('密文.txt','w')
m3.write(mes)
m3.close()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章