我有一个由 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))
我必须添加 % 256,因为有时 x 大于 256,即 不是单个字节。
传递两个字节的事情不会破坏解密,因为 key 与以下数据保持“配对”。
问题是某些解密字符在转换时出错了。 这些字符都是重音字母,例如 à、è、ì,但只是整个重音字母中的几个。其他都正确恢复。
我想这可能是由于 256 mod 但没有它我当然会得到一个 chr 异常...
感谢您的支持
最佳答案
您的解码数据似乎包含值高于 256 的 unicode 字符。在 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))
关于Python逐字节异或解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2806423/