【问题标题】:What is wrong with my decryption function?我的解密功能有什么问题?
【发布时间】:2018-03-22 12:24:54
【问题描述】:
import base64
import re

def encrypt(cleartext, key):
    to_return = bytearray(len(cleartext)) 
    for i in xrange(len(cleartext)):     
        to_return[i] = ord(cleartext[i]) ^ ord(key)
    return base64.encodestring(str(to_return))

def decrypt(ciphertxt,key):
    x = base64.decodestring(re.escape(ciphertxt))
    to_return = bytearray(len(x))
    for i in xrange(len(x)): 
        to_return[i] = ord(x[i]) ^ ord(key)

        while to_return[i]>127:
              to_return[i]-=127

    return to_return

当我加密 bob 然后使用我的解密函数时,它会返回 bob。但是,对于较长的内容,例如加密后的段落,密文包含 \ 斜杠,它不起作用。我没有返回 ascii 字符或 base64 字符我返回奇怪的汉字或方形字符。请任何能指出我正确方向的见解都会有所帮助。

【问题讨论】:

  • 你到底为什么在这里使用re.escape()?那是为了准备正则表达式搜索模式。在它对您的字符串进行任何更改的情况下,它会从那时起完全破坏 Base64 编码。
  • 顺便说一句,这不是凯撒密码的一种形式。
  • 您不必担心其中带有反斜杠的字符串,除非它们是您在脚本中键入的文字字符串。
  • 请不要破坏您的问题或试图破坏人们提交的答案!
  • 当您将材料发布到 Stack Overflow 时,您已同意允许 Stack Overflow 使用该材料,它不再是您的唯一财产。请参阅here

标签: python python-2.7 encryption


【解决方案1】:

正如 jasonharper 所说,您正在通过调用 re.escape 来破坏您的 Base64 数据。一旦你摆脱了它,你的代码应该没问题。我没有对它进行广泛的测试,但它适用于我的多行文本。

您还应该从您的 decrypt 函数中删除它:

while to_return[i]>127: 
    to_return[i]-=127

如果原始明文是有效的 ASCII,它不会做任何事情,但如果明文确实包含大于 127 的字节,它会弄乱解码。

不过,这些功能可能会更高效一些。

FWIW,这是一个在 Python 2 和 Python 3 上都能正常工作的版本。由于在处理文本和字节处理中的变化时做出了妥协,因此这段代码的效率不如在 Python 3 上的效率高。 Python 3。

import base64

def encrypt(cleartext, key):
    buff = bytearray(cleartext.encode())
    key = ord(key)
    buff = bytearray(c ^ key for c in buff)
    return base64.b64encode(bytes(buff))

def decrypt(ciphertext, key):
    buff = bytearray(base64.b64decode(ciphertext))
    key = ord(key)
    buff = bytearray(c ^ key for c in buff)
    return buff.decode()

# Test

s = 'This is a test\nof XOR encryption'
key = b'\x53'
coded = encrypt(s, key)
print(coded)
plain = decrypt(coded, key)
print(plain)

Python 3 输出

b'Bzs6IHM6IHMycyc2ICdZPDVzCxwBczY9MCEqIyc6PD0='
This is a test
of XOR encryption

【讨论】:

  • 我无法重现该问题。你能给我一个产生奇怪输出的示例字符串吗?如果你想给 encrypt 一个带有 反斜杠 的文字字符串,那么你需要正确地对其进行转义,但不要使用 re.escape 来做到这一点。
  • @citruscake 为什么你不能发布文本?不要试图将其放在评论中,将其放在问题末尾的代码块中。而且您不需要发布确切文本,只需发布​​重现您正在谈论的问题的内容即可。
  • 你应该摆脱那个while to_return[i]>127: to_return[i]-=127。抱歉,我应该早点提到的。
  • @citruscake 您应该在问题中提到您正在尝试查找未知密钥。我假设你只是在编码和解码你可以控制的东西。如果您知道该消息应该是有效的 ASCII,那么您可以简单地拒绝任何包含 chars >= chr(127) 的结果。
  • 顺便说一句,您在 Python 2 中执行此操作吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-13
  • 2012-05-27
  • 1970-01-01
  • 2018-02-19
  • 2015-05-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多