-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)で回っていましたが、サイコロはありませんでした。同じキーとプレーンテキストで異なるデータを出力している理由は誰でも知っていますか?目標は私が渡すことができる文字列を持つことです。どんな助けでも大歓迎です!
Python 3では、 'key'と' plain'の両方がUnicode文字列であり、他のものはそこから下り坂になります。 'from __future__ import unicode_literals'を使うと、Python 2で同じ問題が発生します。' key = b'123456 'と 'plain = b'this is test data''を試して、' ord () 'を呼び出します。 – dhke
その両方を試しましたが、それはうまくいかないようです。 "TypeError:+: 'int'と 'str'のエラーがサポートされていないオペランドの型を返します。 – t3ntman
ああ、忘れました。その 'chr()'もやる必要があります。あなたは生のバイトを扱っています – dhke