Я получаю TypeError в моем коде: неподдерживаемые типы операндов для ^: 'bytes' и 'bytes' - PullRequest
0 голосов
/ 11 июля 2019

Я новичок в python3, я получаю следующую ошибку при попытке вывести значение first_block ниже.

 File "cbcmodechal10.py", line 18, in main
    first_block = iv ^ plaintext[0]
TypeError: unsupported operand type(s) for ^: 'bytes' and 'bytes'

Может кто-нибудь также объяснить, почему это происходит, хотя обе переменные в байтах, почему эта операция не успешна?

Я знаю, что есть какая-то проблема с кодировкой utf-8, но не могу понять что?

#!/bin/bash/python3
import urllib.request
import base64
from Crypto.Cipher import AES

def main():
    file = urllib.request.urlopen('https://cryptopals.com/static/challenge-data/10.txt')
    ciphertext = file.read().decode('utf-8')
    cipher = base64.b64decode(ciphertext)
    key = bytes('YELLOW SUBMARINE', 'utf-8')
    iv  = bytes('\x00' * 16, 'utf-8')
    blocksize = 16
    chunks = [cipher[i:i+blocksize] for i in range(0, len(cipher), blocksize)]
    #print(chunks[0])
    cipher1 = AES.new(key, AES.MODE_ECB)
    blocks = int(len(cipher) / blocksize)
    plaintext = [cipher1.decrypt(chunks[j]) for j in range(0, blocks)]
    first_block = iv ^ plaintext[0]
    print(first_block)

if __name__ == '__main__':
    main()

ожидаемый результат: b "Я вернулся и я"

1 Ответ

0 голосов
/ 11 июля 2019

Как я уже сказал, вы должны сделать это с одиночными байтами

first_block = bytes([x^y for x, y in zip(iv, plaintext[0])])

Это дает мне

b"I'm back and I'm"

РЕДАКТИРОВАТЬ: , как предложил @chepnerэто также работает:

first_block = bytes(map(operator.xor, iv, plaintext[0]))
...