Python逐字节异或解密

标签 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 大于 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/

相关文章:

c++ - 为什么我收到 'operator^' 不匹配的错误

Python 计时器没有按预期等待

python - 迭代器是否在 Python 中保留自己的数组副本?

Python 3 在同一行打印 try 语句的输出,我正在尝试学习线程

java - 字符之间的异或运算

javascript - 如何找到与另一个值异或的值?

python - 我可以在 python 中加载 python 代码并将其解析为普通代码行吗?

python-3.x - 如何在Python 3中使用RSA或类似的加密?

php - 替代SSL- "Manual"加密吗?

java - java中的XOR绘画问题