2010-05-10 56 views
3

我有一個VB.net程序使用此功能,以爭奪一個XOR encypted文件:Python的字節

Public Class Crypter 
    ... 
    'This Will convert String to bytes, then call the other function. 
    Public Function Crypt(ByVal Data As String) As String 
     Return Encoding.Default.GetString(Crypt(Encoding.Default.GetBytes(Data))) 
    End Function 

    'This calls XorCrypt giving Key converted to bytes 
    Public Function Crypt(ByVal Data() As Byte) As Byte() 
     Return XorCrypt(Data, Encoding.Default.GetBytes(Me.Key)) 
    End Function 

    'Xor Encryption. 
    Private Function XorCrypt(ByVal Data() As Byte, ByVal Key() As Byte) As Byte() 
     Dim i As Integer 
     If Key.Length <> 0 Then 
      For i = 0 To Data.Length - 1 
       Data(i) = Data(i) Xor Key(i Mod Key.Length) 
      Next 
     End If 
     Return Data 
    End Function 
End Class 

,並保存這樣:

Dim Crypter As New Cryptic(Key) 
'open destination file 
Dim objWriter As New StreamWriter(fileName) 
'write crypted content 
objWriter.Write(Crypter.Crypt(data)) 

現在我要重新使用Python文件,但我有麻煩越來越單字節,這是蟒蛇的XOR功能:

def crypto(self, data): 
    'crypto(self, data) -> str' 
    return ''.join(chr((ord(x)^ord(y)) % 256) \ 
     for (x, y) in izip(data.decode('utf-8'), cycle(self.key)) 

我不得不添加%256,因爲有時x> 256,即不是單個字節

這個通過兩個字節的東西不會破壞解密,因爲密鑰與下列數據保持「配對」。

問題是一些解密字符在轉換中是錯誤的。 這些字符都是重音字母,如à,è,ì,但只是幾個整體重音字母。其他人都正確恢復。

我想這可能是由於256國防部,但沒有它,當然我得到一個CHR例外...

感謝您的支持

+1

我希望你實際上並沒有期望從這裏得到實際的安全性 – 2010-05-10 21:56:01

+0

我需要的只是獲得積分數據,我得到文件炒這種方式,安全性是不是我的責任。 – neurino 2010-05-11 08:56:58

回答

1

事實上,下面一行是錯誤的:

Return Encoding.Default.GetString(Crypt(Encoding.Default.GetBytes(Data))) 

有從地穴返回的字節沒有一般保證有效解碼爲字符串。你會更好地使用Convert.ToBase64String,然後將這個字符串傳遞給你的Python代碼(顯然,你需要能夠Base-64解碼字節。

正如其他人指出的,XORing提供的安全級別足以保護你的數據,也許是你的妹妹。

+0

謝謝,你幾乎是正確的,VB.net函數不完全是我發佈的函數,它使用函數來將「正256模塊」設置爲「防止非字節值,結果始終> = 0和<= 255」,很好地移除了vb.net代碼中的所有反向字符串轉換並直接保存到文件字節中正確使用python閱讀字符。我接近解決方案。 正如我已經回答,它不是我的XOR哭泣的想法,我會很感激,如果有人會打破它,讓我有點傷害,因爲我告訴它,但沒有人在乎...... <_ < – neurino 2010-05-11 10:53:14

3

你的解碼後的數據似乎包含Unicode字符用值高於256.在Python 2.x的chr只能處理256以下使用unichr,而不是chr值,它應該工作:

return ''.join(unichr((ord(x)^ord(y))) \ 
    for (x, y) in izip(data.decode('utf-8'), cycle(self.key)) 
+0

我沒有更多的例外情況,但數據是不正確的。 我的文檔中有很多「平方米」和最被恢復爲「M \ XC2 \ XB2」,但有些作爲「m \ xe2 \ x80 \ xaa」。 我會認爲數據已損壞,但使用VB.net所有「平方米」正確恢復。 (這涉及重音字母太當然:最是正確的,有些沒有) – neurino 2010-05-11 09:03:41

1

如果你打開在文本模式下的文件,它可能是解釋中eted爲Unicode文本。嘗試以二進制模式打開它,使所有字符變成字節。這應該可以避免你的問題chr。如果您使用Python 3.x,請記住,在二進制模式下工作時,應該使用字節文字而不是字符串文字,後者是設計中的Unicode字符串。

+0

我打開文件「RB」模式在Python 2.5,但不得不加 data.decode(「UTF-8」) 無論如何,甚至與如果數據是字符串類型的,那麼看起來我仍然無法逐個獲取字節 – neurino 2010-05-11 09:05:49

2

使用StreamWriter將加擾數據保存爲字符串(即使用默認編碼進行重新編碼)是否正確?直接保存字節不正確? 還是同樣的事情?

Dim objWriter As New StreamWriter(fileName) 
objWriter.Write(Crypter.Crypt(data)) 

哪個Crypter.Crypt被StreamWriter.Write調用?

Public Function Crypt(ByVal Data() As Byte) As Byte() 

或那樣嗎?

Public Function Crypt(ByVal Data As String) As String 

我不方便與Vb.net ...


我碰到這得到什麼字符都參與了對/錯 「²」 轉換

for (x, y) in izip(data.decode('utf-8'), cycle(self.key.decode('utf-8'))): 
    if (ord(x)^ord(y)) > 255 or chr(ord(x)^ord(y)) == '\xb2': 
     print (x, y, chr((ord(x)^ord(y)) % 256), 
       unichr(ord(x)^ord(y)), ord(x), ord(y)) 

我得到這個:

ù K ² ² 249 75 
 p ² ² 194 112 
Æ t ² ² 198 116 
‚ 0 * ‪ 8218 48 

最後一個是錯的因爲雙字節使用......但如果只是一個將很可能獲得通過解密的其餘部分將導致 OUTH的階段

+0

,那麼使用Crypt的第一個重載(並且它的實現是不正確的,因爲我已經回答了)。如果數據的類型是Byte(),那麼第二次重載。如果它是某種其他類型,那麼它取決於數據是否可以隱式轉換爲字符串或字節() – 2010-05-11 10:39:46