2013-04-16 21 views
2

我想在python中做一個簡單的加密腳本。我只是想在二進制文件上使用XOR加密。 我的劇本基本上是這樣的:Python中的二進制文件Xor加密

def xor_c (a): 
    v='' 
    for p in a: 
     v += chr((ord(p)^0xA8)) 
    return v 

這樣做的目的只是每個字節單獨進行加密。 這應該工作,但我做的所有嘗試失敗。

我第一次嘗試:

handler = open("file",'r') 
handler2 = open("output",'w') 
contents = handler.read() 
handler2.write(xor_c(xor_c(contents))) 

但執行後的兩個文件fileoutput是不同的。 由於輸入文件是一個二進制文件(我想要什麼),我已經改變了腳本:

handler = open("file",'rb') 
handler2 = open("output",'wb') 
contents = handler.read() 
handler2.write(xor_c(xor_c(contents))) 

但這並沒有改變任何東西。 從它看起來像,一些字節夫婦在輸出中只有一個字節轉換(也許是因爲字符不是ascii,但這不應該發生在二進制模式...)。而且輸出的最後一個字節是0xA8(邏輯從\0的在輸入文件的末尾轉換得到考慮到這一點我也改變了xor_c功能:

def xor_c (a): 
    v='' 
    for p in a: 
     v += chr((ord(p)^0xA8)) 
    return v[:-1]+'\0' 

爲了確保最後人物將永遠是一個\0但是這也不行。

有什麼建議?評論?祕訣?

感謝

+0

您的代碼在我的電腦上正常工作,並且'handler2'包含與'handler'完全相同的數據。順便說一下:你的'xor_c'效率非常低。我會創建一個轉換表並使用'str.translate'來代替。 – Bakuriu

+0

如果某些字符由多個字節表示,則它可能是一個unicode文件。 Python 2.x和3.x需要不同的方法,所以一個聲明,你使用的版本會有所幫助。 – guidot

+0

@guidot:我正在使用python 2.7。 @Bakuriu:我不明白我可以如何使用'str.translate()'來重新創建我想要的東西。 – ibi0tux

回答

1

(對不起,我看錯在第一個問題)

我認爲這個問題可能在於v初始化:v不應該是一個string,但bytearray

v = bytearray() 

我沒有在這裏驗證工具。

+0

我試着用bytearray(),有變化。有些字節現在可以,但還有一些字節仍然被錯誤轉換。這很奇怪......我在pydoc中看到'ord()'能夠轉換非ASCII字符。你知道它是否有可能試圖一次轉換幾個字節(即使在二進制模式下)? – ibi0tux

2

如果您只是想要執行xor,如果您使用bytearray,則不需要chr()ord()

事實上,你的功能,然後成爲一個班輪;

def xor_c(a): 
    return bytearray([b^0xA8 for b in bytearray(a)]) 

,它工作正常

In [4]: xor_c('Test') 
Out[4]: bytearray(b'\xfc\xcd\xdb\xdc') 

In [5]: r1 = xor_c('Test') 

In [6]: r2 = xor_c(r1) 

In [7]: r2 
Out[7]: bytearray(b'Test') 

有什麼不對您的例子。這是輸入: input image

的,這是一個雙XOR後您的輸出: output

注意,在一些地方,「'」被改造成一個i一個j。這是而不是可能有一個普通的雙xor。

您確定使用了我上面提供的代碼嗎?因爲如果我一個二進制文件的運行它兩次XOR運算數據等於原始數據:

In [1]: def xor_c(a, c=0xA8): 
    ...:  return bytearray([b^c for b in bytearray(a)]) 
    ...: 

In [2]: with open('foo.gz', 'rb') as inf: 
    data = inf.read() 
    ...:  

In [3]: data2 = xor_c(xor_c(data)) 

In [4]: cmp(data, data2) 
Out[4]: 0 

當我將數據寫入到磁盤中,並進行比較,這些文件是相同太:

In [5]: with open('foo2.gz', 'wb') as outf: 
    outf.write(data2) 
    ...:  

> ll foo* 
-rw-r--r-- 1 rsmith rsmith - 4049792 Apr 16 13:15 foo2.gz 
-rw-r--r-- 1 rsmith rsmith - 4049792 Apr 16 12:39 foo.gz 
> diff foo* 
+0

我仍然有同樣的問題。輸入和輸出中的某些字符不相同。 – ibi0tux

+0

@ ibi0tux:你可以給你的問題添加一個例子嗎?它應該是一樣的。 –

+0

下面是我用'less'顯示內容所做的兩個截圖。第一個是輸入文件,第二個是輸出文件。 (輸入文件:[鏈接](http://www.mirari.fr/MYY),輸出文件:[鏈接](http://www.mirari.fr/igDI)) – ibi0tux