2017-12-18 10 views
0

私はカスタムエンコードコードスニペットを書きました。私はPyton 3.6でそれを実行するとき、私はタイプエラーを持っています。私は正確にそれを把握することができませんでした。コードスニペットはPython 2.7でうまく動作しています。種類Python 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を使用するのがより一般的であることを

注:

from operator import xor 

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

XORは自明同じキーを使用して逆転されているためです。クリアXORキーは暗号化テキストを生成し、暗号化XORキーはクリアテキストを再度生成します。

+0

バイトを 'join 'できますか? – RottenCandy

+1

はい、 'bytes.join()'メソッドがありますが、他の 'bytes'オブジェクトにも参加できます。 –

+0

こんにちは@MartijnPieters。あなたの答えは私を助けます。しかし、あなたが投稿したコードは理解できません。簡単に説明できますか? –

関連する問題