2013-11-04 39 views
0

我试图建立一个能翻译,其通过该函数产生的加密的字符串的函数:的Python BASE64 encryptstring

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

因此函数采取一个字符串和一个键具有4个数字(关键是一个字符串),并使用编码字符串函数对其进行编码。 我构建来解码它的函数看起来相同,但有一点不同,编码字符串更改为解码字符串。我认为它应该能够工作,但它会输出一个错误信息,“不正确的填充”。 我应该在解密函数中改变什么来解决这个问题?

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) 

和我说,解密行返回“填充不正确”的错误。

回答

3

你的(不安全的)“加密”函数返回普通的base64编码文本,编码你的密文。

您的解密函数解密输入文本(实际上是base64),然后将“解密”文本传递给base64解码器。

由于原始base64文本未加密,因此试图解密它会导致垃圾,这是无效的base64。

+3

也就是说,你的解密步骤相反。首先执行base64.decodestring,然后使用'^'对所有单个字符进行异或运算。是的,随着加密的进行,这通常是一种非常不安全的方法。 – PaulMcG

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)))) 
+0

感谢您的意见:) – Nityuiop18