Я пытаюсь реализовать шифрование / дешифрование открытого текста RC4, и некоторое время я застрял на шаге XOR.
Мой код выглядит так:
def byteXOR(a, b):
#TODO take two lists of byte string and return a list with the xor product of them
u = a.split()
v = b.split()
print('Fst: \t {}'.format(u))
print('Snd: \t {} \n'.format(v))
'''Fill inn 0' if a bit is shorter than the other'''
for x,y in zip(u, v):
if len(x) != len(y):
if len(x) < len(y):
x.zfill(len(y) - len(x))
elif len(x) > len(y):
y.zfill(len(x) - len(y))
xor = [ord(x) ^ ord(y) for (x, y) in zip(a, b)]
print('Fst: \t {}'.format(u))
print('Snd: \t {}'.format(v))
print('XOR: \t {}'.format(xor))
return xor
p = "1111 1010001 10111111 11111010 10101011"
q = "1101000 1100101 1101100 1101100 1101111"
byteXOR(p, q)
Я получаю этот вывод:
Fst: ['1111', '1010001', '10111111', '11111010', '10101011']
Snd: ['1101000', '1100101', '1101100', '1101100', '1101111']
Fst: ['1111', '1010001', '10111111', '11111010', '10101011']
Snd: ['1101000', '1100101', '1101100', '1101100', '1101111']
XOR: [0, 0, 1, 0, 16, 1, 0, 17, 1, 1, 0, 1, 17, 1, 1, 17, 0, 0, 1, 0, 0, 16, 1, 17, 0, 0, 1, 1, 0, 0, 16, 17, 1, 0, 0, 0, 1, 0, 0]
Первая проблема, которую я не могу решить, это как убедиться, что битовые строки имеют одинаковую длину, я использовал встроенный метод zfill (), но когда я распечатайте списки они без изменений.
Вторая проблема, с которой я столкнулся, заключается в том, как получить желаемый результат произведения XOR n-ых элементов из каждого списка, например:
Fst: ['0001111', '1010001', '10111111', '11111010', '10101011']
Snd: ['1101000', '1100101', '01101100', '01101100', '01101111']
XOR: ['0110011', '0110100', '11010011', '10010110', '11000100']