делать XOR для двоичных файлов в Python - PullRequest
2 голосов
/ 21 февраля 2012

Я нахожусь в процессе написания простой хеш-функции, которая получает данные и создает 32-битный хеш-файл.Я застрял в XOR части.И я не уверен, как я должен написать функцию для XOR.Пожалуйста, помогите мне с этим.вот код, который я сделал еще:

import BitVector
import io
import math
import struct

if __name__ == "__main__":
    message = raw_input("your message:")
    f= open('file.dat','w')
    f.write(message)
    f.close()

    f = open('file.dat')
    while 1:
       r = f.readline(1)
       hx = r.encode("hex")
       data = bin(int(hx, 16))[2:]
       key = 11111111
       x = int(data) ^ int(key)
       print hex(x)
       if not r:break
    f.close()

Ответы [ 2 ]

3 голосов
/ 21 февраля 2012

Оператора ^ вполне достаточно для вас.

>>> 2 ^ 1
3
>>> 3 ^ 1
2

Все, что вам нужно, это битовый размер вашего ключа и битовый размер данных для xor, чтобы убедиться, чтофункциональность.

Кстати, операции xor должны применяться только к целым числам.

import struct

key = 0xFEEEFEEE
with open('file', 'rb') as f:
    integer = f.read(4) # In fact, you could read all in.
    while len(integer) >= 4:
        # if integer is not a string longer than 4, next line crash.
        s, = struct.unpack('i', integer) # The return value is a tuple with integers.
        print key ^ s
        integer = f.read(4)
0 голосов
/ 21 февраля 2012

попробуйте использовать это для ксоринга:

def xor_orig(data, key):
    return bool(data) ^ bool(key)

Для бинарного ксиринга, где данные и ключ являются двоичными значениями и используются символы ^, вы можете использовать:

def xor_orig(data, key):
    return int(data,2) ^ int(key,2)


In [1]: data = '1010'
In [2]: key = '0101'    
In [3]: int(data,2) ^ int(key,2)
Out[3]: 15
In [4]: data = '10'    
In [5]: key = '01'    
In [6]: int(data,2) ^ int(key,2)
Out[6]: 3
In [7]: data = '10'    
In [8]: key = '10'    
In [9]: int(data,2) ^ int(key,2)
Out[9]: 0

Пустья знаю, поможет ли это.

...