我有一个被VB.net程序使用以下函数加密的XOR文件:
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重新打开文件,但我在获取单个字节方面遇到了麻烦,以下是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))
由于 x 有时会大于 256,即不是单个字节,因此我必须添加 % 256。
传递两个字节的问题不会破坏解密,因为密钥将与以下数据“配对”。
问题在于转换中某些已解密字符是错误的。 这些字符都是带重音的字母,如 à、è、ì,但是只有少数带重音的字母。 其他字母都恢复正确了。
我猜这可能是由于 256 取模的原因,但如果没有它,我当然会得到 chr 异常...
感谢您的支持