在python 3.6中处理自定义编码时遇到类型错误

问题描述 投票:0回答:1

我写了一个自定义编码代码片段。当我在python 3.6上运行它时,我遇到了类型错误。我无法弄明白。代码片段与python 2.7一起正常工作。

import os
import sys
import base64

def encode(key, clear):
    """encode custom """
    enc = []
    for i in range(len(clear)):
        key_c = key[i % len(key)]
        enc_c = chr((ord(clear[i]) + ord(key_c)) % 256)
        #change the int or str
        enc.append(enc_c)
    return base64.urlsafe_b64encode("".join(enc))

clear = "ABCDEFGH"
encode_var = encode("crumbs", clear)

错误日志:

(py3) C:\Dev\crumbles>python s1.py
Traceback (most recent call last):
  File "s1.py", line 45, in <module>
    encode_var = encode("crumbs", clear)
  File "s1.py", line 42, in encode
    return base64.urlsafe_b64encode("".join(enc))
  File "C:\Users\Cookie1\Anaconda3\envs\py3\lib\base64.py", line 118, in urlsafe
_b64encode
    return b64encode(s).translate(_urlsafe_encode_translation)
  File "C:\Users\Cookie1\Anaconda3\envs\py3\lib\base64.py", line 58, in b64encod
e
    encoded = binascii.b2a_base64(s, newline=False)
TypeError: a bytes-like object is required, not 'str'
python python-3.x base64
1个回答
1
投票

您传入的是文本,而不是二进制bytes对象。 base64.urlsafe_b64encode()函数需要字节,而不是文本。

生成字节代替:

from itertools import cycle

def encode(key, clear):
    """encode custom """
    key, clear = cycle(key.encode()), clear.encode() 
    enc = bytes((c + k) % 256 for c, k in zip(clear, key))
    return base64.urlsafe_b64encode(enc)

我使用了一些迭代器技巧来产生bytes()接受的整数。

请注意,在创建单密钥加密时,使用XOR生成加密字节更为常见:

from operator import xor

key, clear = cycle(key.encode()), clear.encode() 
enc = bytes(map(xor, clear, key))

那是因为使用相同的键可以简单地颠倒XOR; clear XOR键产生加密文本,加密XOR键再次产生明文。

© www.soinside.com 2019 - 2024. All rights reserved.