每字节Python字节XOR解密

时间:2010-05-10 20:59:41

标签: python encryption xor

我有一个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是&gt; 256,即不是单个字节

传递两个字节的东西不会破解解密,因为密钥与以下数据保持“配对”。

问题是转换中的某些解密字符是错误的。 这些字符都是重音字母,如à,è,“但只是一些整体重音字母。其他都正确恢复。

我想这可能是由于256 mod但没有它我当然会得到一个chr异常......

感谢您的支持

4 个答案:

答案 0 :(得分:3)

您的解码数据似乎包含值大于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))

答案 1 :(得分:2)

使用StreamWriter将加扰数据保存为字符串(即使用默认编码重新编码)是否正确?直接保存字节会不正确? 或者它是一回事吗?

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

StreamWriter.Write调用哪个Crypter.Crypt?

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 of phase

答案 2 :(得分:1)

如果您在文本模式下打开文件,它可能会被解释为Unicode文本。尝试以二进制模式打开它以使所有字符成为字节。这应该可以避免chr的问题。如果您使用的是Python 3.x,请记住,在二进制模式下工作时,您应该使用字节文字而不是字符串文字,后者是设计的Unicode字符串。

答案 3 :(得分:1)

确实,以下行是错误的:

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

没有一般保证从Crypt返回的字节有效解码为字符串。你最好使用Convert.ToBase64String,然后将那个字符串传递给你的Python代码(显然,你需要能够对字节进行Base-64解码。

正如其他人所指出的那样,XORing提供的安全级别足以保护您的数据,可能还有您的妹妹。