我有一个 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 即不是单个字节。
传递两个字节的事情不会破坏解密,因为密钥与以下数据保持“配对”。
问题是转换中的某些解密字符是错误的。这些字符都是重音字母,例如 à、è、ì,但只是整体重音字母中的一小部分。其他都正确恢复。
我想这可能是由于 256 mod 但没有它我当然会得到一个 chr 异常......
谢谢你的支持