2017-12-18 3 views
0

사용자 지정 인코딩 코드 스 니펫을 작성했습니다. 내가 Pyton 3.6에서 실행할 때 유형 오류가 발생했습니다. 나는 그것을 정확하게 파악할 수 없었다. 코드 스 니펫은 python 2.7에서 잘 작동합니다.유형 파이썬 3.6에서 사용자 지정 인코딩 작업 중 오류가 발생했습니다.

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' 

답변

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을 사용하는 것이 일반적인 것이

참고 : XOR은 사소 동일한 키를 사용하여 반전되기 때문이다

from operator import xor 

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

단계; clear XOR 키는 암호화 된 텍스트를 생성하고 encryption 된 XOR 키는 cleartext를 다시 생성합니다.

+0

우리는'join' 바이트를 사용할 수 있습니까? – RottenCandy

+1

예,'bytes.join()'메소드가 있지만, 그것도 다른'bytes' 오브젝트에 참여할 수 있습니다. –

+0

안녕하세요 @MartijnPieters. 귀하의 답변이 도움이됩니다. 그러나 나는 당신이 게시 한 코드를 이해할 수 없다. 간단히 설명해주십시오. –

관련 문제