0

この関数によって生成された暗号化された文字列を翻訳できる関数を構築しようとしました:

def encrypt2(message,key):
return base64.encodestring("".join([chr(ord(message[i]) ^ ord(key[i % len(key)])) 
                                 for i in xrange(len(message))]))

したがって、関数は文字列と 4 桁のキー (キーは文字列) を受け取り、encodestring 関数を使用してエンコードします。それをデコードするために構築する関数は同じように見えますが、1 つの違いを除いて、エンコード文字列がデコード文字列に変わります。私の意見では、うまくいくはずですが、「パディングが正しくありません」というエラーメッセージが出力されます。この問題を解決するには、復号化関数で何を変更すればよいですか?

def decrypt2(message,key):
    return (base64.decodestring("".join([chr(ord(message[i]) ^ ord(key[i % len(key)])) 
                                      for i in xrange(len(message))])))

これは私が実行しようとしたものです:

message = "n"
key = "8080"
encrypt = encrypt2(message,key)
decrypt = decrypt2(encrypt,key)
print "Message: %s \nEncrypt: %s \nDecrypt: %s" %(message,encrypt,decrypt)

そして、私が言ったように、復号化のある行は「不正なパディング」エラーを返しました.

4

2 に答える 2

0

提案を具体的にするには、デコード関数を次のように置き換えます。

def decrypt2(message,key):
    decoded = base64.decodestring(message)
    return "".join(chr(ord(decoded[i]) ^ ord(key[i % len(key)]))
                   for i in xrange(len(decoded)))

これを行うためのより効率的な方法があります ;-) たとえば、

def decrypt2(message, key):
    from itertools import cycle
    decoded = base64.decodestring(message)
    return "".join(chr(a ^ b) for a, b in zip(map(ord, decoded),
                                              cycle(map(ord, key))))
于 2013-11-04T19:26:56.383 に答える