TypeError:无法将字节连接到 str。 Pycrypto Aes 加密

Posted

技术标签:

【中文标题】TypeError:无法将字节连接到 str。 Pycrypto Aes 加密【英文标题】:TypeError: can't concat bytes to str. Pycrypto Aes encryption 【发布时间】:2017-03-05 13:43:49 【问题描述】:

尝试使用 pycryptodome 3.4.2 使用 python 3 的 aes 加密来加密/解密文本

当然,我在 Internet 上找到了这种方法,并尝试根据需要更改它,但我得到的只是错误。

代码如下:

def aes():
    #aes
    print('1.Шифруем')
    print('2.Дешифруем')
    c = input('Ваш выбор:')
    if int(c) == 1:
        #shifr
        os.system('clear')
        print('Шифруем значит')
        print('Введите текст, который хотите зашифровать')
        text = input()
        with open('Aes/plaintext.txt', 'wb') as f:
            f.write(text.encode('utf-8'))
        BLOCK_SIZE = 16
        PADDING = ''
        pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * PADDING
        EncodeAES = lambda c, s: base64.b64encode(c.encrypt(pad(s)))
        secret = os.urandom(BLOCK_SIZE)
        with open('Aes/secret.bin', 'wb') as f:
            f.write(secret)
        cipher = AES.new(secret, AES.MODE_CFB)
        with open('Aes/plaintext.txt', 'rb') as f:
            text = f.read()
        encoded = EncodeAES(cipher, text)
        with open('Aes/ciphertext.bin', 'wb') as f:
            f.write(encoded)
        print (encoded)
    if int(c) == 2:
        os.system('clear')
        print('Дешифруем значит')
        PADDING = ''
        with open('Aes/ciphertext.bin', 'rb') as f:
            encoded = f.read()
        with open('Aes/secret.bin', 'rb') as keyfile:
            secret = keyfile.read()
        DecodeAES = lambda c, e:    c.decrypt(base64.b64decode(e)).rstrip(PADDING)
        cipher = AES.new(secret, AES.MODE_CFB)
        decoded = DecodeAES(cipher, encoded)
        with open('Aes/plaintext.txt', 'w') as f:
            f.write(str(decoded))
        print(decoded)    

但是当我试图解密一些文本时,我得到了这个错误:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3/dist-packages/spyderlib/widgets/externalshell/sitecustomize.py", line 699, in runfile
execfile(filename, namespace)
File "/usr/lib/python3/dist-packages/spyderlib/widgets/externalshell/sitecustomize.py", line 88, in execfile
exec(compile(open(filename, 'rb').read(), filename, 'exec'), namespace)
File "/home/tukanoid/Desktop/Enc_dec2/Enc_dec.py", line 475, in <module>
aes()
File "/home/tukanoid/Desktop/Enc_dec2/Enc_dec.py", line 178, in aes
encoded = EncodeAES(cipher, text)
File "/home/tukanoid/Desktop/Enc_dec2/Enc_dec.py", line 166, in <lambda>
EncodeAES = lambda c, s: base64.b64encode(c.encrypt(pad(s)))
File "/home/tukanoid/Desktop/Enc_dec2/Enc_dec.py", line 162, in <lambda>
pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * PADDING
TypeError: can't concat bytes to str

实际上,我不知道 lambda 是做什么的,但我认为我因此而收到此错误。谢谢。

【问题讨论】:

TypeError: can't concat bytes to str, trying to use python3 可能重复,您需要在任何地方使用字节。 【参考方案1】:

您正在以 rb 的形式读取文本文件,这在 python 3 中返回一个 bytes 对象。

在函数中,您使用 str 对象填充,因此出现错误。 Python 3 清楚地将二进制数据与文本数据分开,这是 Python 2 没有做到的。

    PADDING = ''
    pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * PADDING

open('Aes/plaintext.txt', 'rb') 更改为open('Aes/plaintext.txt', 'r'),你会在两边都得到ascii,这样就可以了。

(或将PADDING 更改为bytes('',encoding="ascii") 或正如詹姆斯所说的b"")。

【讨论】:

坚持字节似乎适合aes加密,这是一种基于字节的操作。 PADDING = b'' 也应该可以工作。 Tnx,但现在我有这个错误:EncodeAES = lambda c, s: base64.b64encode(c.encrypt(pad(s))) expect_byte_string(plaintext) raise TypeError("Only byte strings can传递给 C 代码”) TypeError: 只有字节字符串可以传递给 C 代码 然后替代解决方案:将 PADDING 更改为 bytes('',encoding="ascii") 并保持文件打开为"rb"。告诉我它是如何为你工作的。

以上是关于TypeError:无法将字节连接到 str。 Pycrypto Aes 加密的主要内容,如果未能解决你的问题,请参考以下文章

TypeError:只能将列表(不是“str”)连接到列表 -

TypeError:在使用 Python 进行网络抓取时,只能将 str(而不是“列表”)连接到 str 错误

Pandas TypeError:只能将str(不是“int”)连接到str

解决 TypeError:只能将元组(不是“str”)连接到元组

只能将 str (不是“字节”)连接到 str

Python3 错误:TypeError:无法将“字节”对象隐式转换为 str