【问题标题】:Python base64 encryptstringPython base64 加密字符串
【发布时间】:2013-11-04 19:15:02
【问题描述】:

我试图构建一个函数来翻译由该函数生成的加密字符串:

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 函数对其进行编码。 我为解码它而构建的函数看起来相同,但有一个区别,encodestring 更改为 decodestring。我认为它应该可以工作,但它会打印一条错误消息,“不正确的填充”。 我应该在解密函数中改变什么来解决这个问题?

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)

正如我所说,解密的那一行返回了一个“不正确的填充”错误。

【问题讨论】:

    标签: python encryption base64


    【解决方案1】:

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

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

    由于原始 base64 文本未加密,因此尝试对其进行解密会导致垃圾,这不是有效的 base64。

    【讨论】:

    • 也就是说,你的解密步骤反过来了。首先执行 base64.decodestring,然后使用 '^' 对所有单个字符进行异或。是的,随着加密的进行,这通常是一种非常不安全的方法。
    【解决方案2】:

    要使建议具体化,请像这样替换您的解码功能:

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

    【讨论】:

    • 感谢您的建议 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-19
    • 1970-01-01
    • 1970-01-01
    • 2012-10-25
    • 1970-01-01
    • 2016-08-11
    相关资源
    最近更新 更多