CTF題目中XOR加密解法指令碼

2021-09-17 21:36:57 字數 2138 閱讀 8260

簡單異或密碼(英語:****** xor cipher)是密碼學中一種簡單的加密演算法,它按照如下原則進行運算:

a \oplus 0 = a

a \oplus a = 0

(a \oplus b) \oplus c = a \oplus (b \oplus c)

(b \oplus a) \oplus a = b \oplus 0 = b

其中 \oplus 為邏輯異或(xor)運算的符號。按這種邏輯,文字序列的每個字元可以通過與給定的金鑰進行按位異或運算來加密。如果要解密,只需要將加密後的結果與金鑰再次進行按位異或運算即可。

例如,字串「wiki」(8位ascii:01010111 01101001 01101011 01101001) 可以按如下的方式用金鑰11110011進行加密:

01010111 01101001 01101011 01101001

\oplus 11110011 11110011 11110011 11110011

= 10100100 10011010 10011000 10011010

此種加密方法類似對稱加密,故解密的方式如下:

10100100 10011010 10011000 10011010

\oplus 11110011 11110011 11110011 11110011

= 01010111 01101001 01101011 01101001

異或運算子常作為更為複雜的加密演算法的組成部分。對於其本身來說,如果使用不斷重複的金鑰,利用頻率分析就可以破解這種簡單的異或密碼。如果訊息的內容被猜出或知道,金鑰就會洩露。異或密碼值得使用的原因主要是其易於實現,而且計算成本小。簡單重複異或加密有時用於不需要特別安全的情況下來隱藏資訊。

如果金鑰是隨機的(不重複),而且與訊息長度相同,異或密碼就會更為安全。當金鑰流由偽隨機數發生器生成時,結果就是流密碼。若金鑰是真正隨機的,結果就是一次性密碼本,這種密碼在理論上是不可破解的。

在這些密碼的任何部分中,金鑰運算子在已知明文攻擊下都是脆弱的,這是因為明文 \oplus 密文 = 金鑰。

已知明文和密文:

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)]

根據異或原理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()

CTF題目整理

最近在整理一些ctf題目,遇到很多很有意思的東西,記錄下來 0x01 柵欄加密 柵欄加密法是一種比較簡單快捷的加密方法。柵欄加密法就是把要被加密的檔案按照一上一下的寫法寫出來,再把第二行的文字排列到第一行的後面。相應的,破譯方法就是把文字從中間分開,分成2行,然後插入。柵欄加密法一般配合其他方法進行...

CTF中基本的Xor解密操作

先解密base64,然後進行xor的檢測及解密 usr bin python3 coding utf 8 author valecalida 異或運算僅允許數字之間的運算,不允許其他型別之間的運算 from base64 import b64decode as b64d message input ...

ctf本地包括 檔案包含CTF題目

檔案包含 150 2 解題方法 使用php filter協議讀取index檔案。3 原始碼分析 asdf error reporting 0 if get file file get file if strstr file,stristr file,tp stristr file,input str...