我有一个VBE程序的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异常……
感谢您的支持
最佳答案 确实,以下行是错误的:
Return Encoding.Default.GetString(Crypt(Encoding.Default.GetBytes(Data)))
没有一般保证从Crypt返回的字节有效解码为字符串.你最好使用Convert.ToBase64String,然后将该字符串传递给你的Python代码(显然,你需要能够对字节进行Base-64解码).
正如其他人所指出的那样,XORing提供的安全级别足以保护您的数据,可能还有您的小妹妹.