2016-11-09 109 views
0

所以我試圖找到一個時間鍵的密鑰,我有10個密文(明文字母編碼爲8位ASCII 和給定的密文寫在十六進制;我是使用python 2.7)XoR兩個十六進制

這個想法是,當你使用空格字符時,字符會變成大寫或小寫字母,而當你使用x變換x時,它會返回零,所以當我將兩個字符變爲密文時,與密鑰和消息字符一起使用消息字符。 所以我寫了這個代碼xoring兩個十六進制。

def hex_to_text(s): 
    string=binascii.unhexlify(s) 
    return string 

def XoR (a,b): 
    a="0x"+a 
    b="0x"+b 
    xor=chr(int(a,16)^int(b,16)) 
    return hex_to_text(xor[2:]) 

時,關鍵是偶數它的XOR功能工作正確的,但在關鍵的是奇不返回相同的字符大寫或小寫。

我在做什麼錯?

+0

如果你有10個使用相同的One Time Pad的密文,那麼它不是一個時間片,而是一個十時間片。如果它是一個真正的One Time Pad,那麼你找不到密鑰,你所能做的就是找到所有可能產生可理解輸​​出的密鑰。 – rossum

+0

它們都用同一個密鑰加密,練習的黃金是找鑰匙 –

+0

十個時間墊是可以解決的。只要爲每個位置嘗試不同的關鍵字母,直到所有十個文本都有意義。 – rossum

回答

0

如何解決這個問題,無論Python中的總體思路:

讓我們開始說一個char是8位ASCII

,如果你看一下第一個字符形式的第一密文,你可能會注意到它在純文本的ascii值之外,可以說是az 0x61-0x5a AZ 0x41-0x5a

很有可能你只需要考慮使用此char字符進行存儲的值,它在指定的範圍內的東西

對於其他9個文本和它們各自的第一個字符也是一樣的,所以我們看起來每一個密文都必須適用於每個具有相同密鑰的密文的這個字符的可能密鑰值的列表,所以有趣的是,這個字符的可能密鑰值的列表必須保持不變在進一步降低範圍

現在,你可以用這種方法做什麼?

寫一個函數,採用2個參數(字節)和測試一個異或的結果落入規定的範圍,如果是,則返回1,如果沒有返回0

現在使3個嵌套循環來調用這個功能

外環(X)經過在所述密文 中間環路(Y)的炭位置從0到255 內環(Z)穿過密文

在內部循環調用函數

參數1是Z密文和參數的X字符2爲Y

現在做什麼用的結果:

你想擁有一本字典/查找表,每個位置X擁有255個元素

這些元素的指數爲Y數組

這些元素的值將成爲所有函數結果的總和,最終你所擁有的是密文中的每個位置,這是一個數組,它告訴你每個keybyte它是多麼可能是密鑰的數組。 ...該值越高的在你的密文順序是關鍵字節

然後爲每個位置由它們的概率可能keybytes和概率劃分他們

然後採取所有的密文的塊的可能性就越高,可以說第8到16個字符,並計算出明文的概率最高組

存儲鍵塊和純文本塊中的所有鍵一起在列表

現在測試您對常見的字典可能明文的列表,如果它們包含單詞t,再次評價它們1帽子可以在字典中找到,否則爲0 ...總結所有不同的密文......(或者使用另一個度量來評價密鑰的好壞)

以最高值排序密鑰塊(閱讀:潛在地解決了所有密文中大部分塊的關鍵是先出現並且產生垃圾的關鍵字最後)並繼續下一個塊...

用更大的塊重複此操作,選擇不是關鍵字,而是選擇下一個更小的大小關鍵塊,直到你的塊大小達到密文大小...

當然這是一個自動化的方式來找到一個可能的關鍵,有一些實施工作,直到你有一個完全自動化解決方案。如果你只是想解決這10個密文,你可以在可能的關鍵字或第一個塊之後放棄該方法,然後用手完成其餘的部分...