Python逐字节异或解密

2024-06-16 10:31:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个XOR加密文件VB.net版使用此函数进行加扰的程序:

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

以这种方式保存:

^{pr2}$

现在我必须用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,也就是说,不是一个字节。在

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

问题是某些解密字符在转换时出错。 这些字符都是重音字母,如a,è,ì,但是只有几个重音字母。其他的都恢复正常了。在

我想这可能是由于256模式,但没有它,我当然得到了一个chr例外。。。在

谢谢你的支持


Tags: keydefaultdatastringreturnasfunctionbyte
3条回答

解码后的数据似乎包含值大于256的unicode字符。在python2.x中,chr只能处理256以下的值。使用^{}代替chr,它应该可以工作:

return ''.join(unichr((ord(x) ^ ord(y))) \
    for (x, y) in izip(data.decode('utf-8'), cycle(self.key))

使用StreamWriter将加扰数据保存为字符串(即使用默认编码重新编码)是否正确?直接保存字节不正确吗? 还是一样的?在

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

哪个密码员。密码由调用StreamWriter写什么?在

这个

^{pr2}$

还是这个?在

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

最后一个错误是因为使用了双字节。。。但是,如果只传递一个,那么剩下的解密可能会导致出相

事实上,下面这句话是错误的:

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

不能保证从Crypt返回的字节是否可以作为字符串解码。你最好用Convert.ToBase64String,然后将这个字符串传递给Python代码(显然,您需要能够对字节进行Base-64解码。在

正如其他人所指出的,XORing提供的安全级别足以保护您的数据不受您的小妹妹的影响。在

相关问题 更多 >