Python байт за байт XOR расшифровка - PullRequest
3 голосов
/ 11 мая 2010

У меня есть файл, зашифрованный 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

и сохранил таким образом:

Dim Crypter As New Cryptic(Key)
'open destination file
Dim objWriter As New StreamWriter(fileName)
'write crypted content
objWriter.Write(Crypter.Crypt(data))

Теперь мне нужно снова открыть файл с помощью Python, но у меня возникают проблемы с получением отдельных байтов , это функция XOR в python:

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, но без него я, конечно, получаю исключение chr ...

Спасибо за вашу поддержку

Ответы [ 4 ]

3 голосов
/ 11 мая 2010

Ваши декодированные данные содержат символы Unicode со значениями выше 256. В 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))
2 голосов
/ 11 мая 2010

Правильно ли сохранять зашифрованные данные в виде строки (то есть перекодировать в кодировке по умолчанию) в StreamWriter? Не было бы правильно сохранять байты напрямую? Или это одно и то же?

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

Какой Crypter.Crypt вызывается StreamWriter.Write?

Это

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 фазы

1 голос
/ 11 мая 2010

Действительно, следующая строка неверна:

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

Нет общей гарантии того, что байты, возвращаемые из Crypt, действительны для декодирования в виде строки. Вам лучше использовать Convert.ToBase64String, а затем передавать эту строку в ваш код Python (где, очевидно, вам понадобится Base-64 для декодирования байтов.

И как уже указывали другие, уровень безопасности, который обеспечивает XORing, достаточен для защиты ваших данных, возможно, от вашей младшей сестры.

1 голос
/ 11 мая 2010

Если вы открываете файл в текстовом режиме, он может быть интерпретирован как текст Unicode. Попробуйте открыть его в двоичном режиме, чтобы превратить все символы в байты. Это должно избежать ваших проблем с chr. Если вы используете Python 3.x, помните, что при работе в двоичном режиме вы должны использовать байтовые литералы, а не строковые литералы, последние из которых являются строками Unicode.

...