2015-01-02 4 views
2

Так что это немного код, который использовался для работы самостоятельно, но когда я попытался реализовать его в своем коде, он дал мне ошибку, я думаю, это потому, что я мутировал биты внутри s2 есть ли другой способ XOR s3 без binascii.a2b_qpОшибка Python XOR

def xor(s1,s2): 
    s3 =''.join(chr(i^j) for i,j in zip(s1,s2)) 
    s4 = binascii.a2b_qp(s3) 
    s5 = ''.join(chr(i^j) for i,j in zip(s2,s4)) 
    print(s5) 

# for testing: 
# additional info, s1 is a mutated form of bits from s2 using an S box 
s1 = b'\xc3\xbf\x00\x00\xc3\xbf\x00\xc3\xbf\x00\x00' 
s2 = b'aaaaaaaa' 
xor(s1, s2) 

TraceBack:

Traceback (most recent call last): 
    File "C:\Users\Pavilion g7\workspace\Python Network\RW.py", line 138, in <module> 
    x= xor(m1,m2) 
    File "C:\Users\Pavilion g7\workspace\Python Network\RW.py", line 69, in xor 
    s4 = binascii.a2b_qp(s3) 
ValueError: string argument should contain only ASCII characters 
+0

Какой вклад вы даете ему, который вызывает эту ошибку? – senshin

+0

Это гораздо полезнее, если вы можете показать всю трассировку ошибок, а не только сообщение об ошибке. –

+1

@Newbie Был ли код ранее на Python 2, и теперь вы используете его на Python 3? Поведение «chr» изменилось между двумя версиями; в Python 3, он возвращает 'str' (т. е. unicode). – senshin

ответ

2

Как уже было прокомментировано, chr() возвращает строку.

В this question вы получите совет о том, как его заменить.

Аналогично, вы не должны .join() с пустой строкой '', но с b'', пустым объектом байтов.

Пример:

def bchr(i): 
    return bytes([i]) 

def xor(s1,s2): 
    return b''.join(bchr(i^j) for i, j in zip(s1, s2)) 

s1 = b'\xc3\xbf\x00\x00\xc3\xbf\x00\xc3\xbf\x00\x00' 
s2 = b'aaaaaaaa' 
s3 = xor(s1, s2) 
s4 = binascii.a2b_qp(s3) 
s5 = xor(s2, s4) 
print(s5) 

s5 еще не s1, это потому, что s2 слишком коротка. Заменить его на

s2 = b'a' * len(s1) 

и все готово. В настоящее время она работает, а с

s5 = xor(s2, s3) 
print(s5 == s1) # -> True 

тем самым устраняя необходимость binascii материала в целом.

+0

ну, я уверен, что s1 и s2 имеет одинаковое число бит, так как, когда я реализовать результаты, обратной Sbox s1 в s2 – Newbie

+0

блоке = b'aaaaaaaa» двоичные = getBin (блок) s1 = initialPerm (двоичный) s2 = inversePerm (s1) m1 = bitsToString (s1) м2 = bitsToString (с2) печати (m1) печати (м2) Ь '\ xc3 \ XBF \ x00 \ x00 \ xc3 \ XBF \ x00 \ xc3 \ XBF \ x00 \ x00' б 'aaaaaaaa' – Newbie

+0

11 байтов имеют 88 бит, 8 байтов имеют 64 бита. Я не знаю, почему 's1' больше, чем' block' ... – glglgl