4

我有一个 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 异常......

谢谢你的支持

4

4 回答 4

3

您的解码数据似乎包含值高于 256 的 unicode 字符。在 Python 2.xchr中只能处理低于 256 的值。使用unichr而不是chr它应该可以工作:

return ''.join(unichr((ord(x) ^ ord(y))) \
    for (x, y) in izip(data.decode('utf-8'), cycle(self.key))
于 2010-05-10T21:03:46.087 回答
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

最后一个是错误的,因为使用了双字节……但如果只通过一个字节,其余的解密可能会导致反相

于 2010-05-11T09:16:43.467 回答
1

确实,以下行是错误的:

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

不能普遍保证从 Crypt 返回的字节对于解码为字符串是有效的。您最好使用 Convert.ToBase64String,然后将该字符串传递给您的 Python 代码(显然,您需要能够对字节进行 Base-64 解码。

正如其他人所指出的那样,XORing 提供的安全级别足以保护您的数据免受您的小妹妹的侵害。

于 2010-05-11T10:29:13.827 回答
1

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

于 2010-05-10T21:38:04.240 回答