2017-10-27 14 views
-1

私はPython 2.xおよび3.xでRC4暗号化を実装しようとしていますが、次のコードは実行中のPythonのバージョンに基づいて異なる暗号化文字列を出力します。Python 2.xおよび3.x RC4暗号化

def crypt(key, data): 
    S = list(range(256)) 
    j = 0 

    for i in list(range(256)): 
     j = (j + S[i] + ord(key[i % len(key)])) % 256 
     S[i], S[j] = S[j], S[i] 

    j = 0 
    y = 0 
    out = [] 

    for char in data: 
     j = (j + 1) % 256 
     y = (y + S[j]) % 256 
     S[j], S[y] = S[y], S[j] 
     out.append(chr(ord(char)^S[(S[j] + S[y]) % 256])) 

    return ''.join(out) 

if __name__ == '__main__': 
    key = '123456'     # proof of concept 
    plain = 'this is test data'  # proof of concept 

    encrypted = crypt(key, plain) 
    print('Encrypted: \n' + encrypted) 

のPython 2.xの出力を実行:

のPython 3.xの出力を実行する

Encrypted: t?Zf? RQ??Z ??

Encrypted: tZf¼ RQÂÙZ º

私は最初、これはエンコーディングの問題だと思いました(ASCIIとUTF-8)で回っていましたが、サイコロはありませんでした。同じキーとプレーンテキストで異なるデータを出力している理由は誰でも知っていますか?目標は私が渡すことができる文字列を持つことです。どんな助けでも大歓迎です!

+0

Python 3では、 'key'と' plain'の両方がUnicode文字列であり、他のものはそこから下り坂になります。 'from __future__ import unicode_literals'を使うと、Python 2で同じ問題が発生します。' key = b'123456 'と 'plain = b'this is test data''を試して、' ord () 'を呼び出します。 – dhke

+0

その両方を試しましたが、それはうまくいかないようです。 "TypeError:+: 'int'と 'str'のエラーがサポートされていないオペランドの型を返します。 – t3ntman

+0

ああ、忘れました。その 'chr()'もやる必要があります。あなたは生のバイトを扱っています – dhke

答えて

関連する問題