Python从字符串中删除填充字符

时间:2018-03-27 10:32:38

标签: python python-3.x

我正在尝试创建一个从字符串中删除填充字符的函数。

基本上我有两个python脚本,

  1. 将插入填充和
  2. 其他脚本应将其删除。
  3. 我已经有了一个插入填充的函数,如下所示:

    def padding():
        message = input('Enter your message: ')
        padding = random.choice(string.ascii_letters)
        extra = len(message) % 16
        if extra > 0:
            paddedMessage = Message + (padding * (16 - extra))
    

    我想我要问的是从邮件中删除填充的最佳方法是什么?请记住,填充将始终为16的倍数,并且始终是随机字母。

    paddedMessage可能输出的一些示例可能是:

    helloDDDDDDDDDDD
    this is my secret messageqqqqqqq
    

    感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

正如所有评论所述,使用字符串包含的相同字符无法取回原始字符串。

即使您选择了字符串包含的ascii字母,您如何确定此字母不是邮件的一部分,这是确切的大小,因此填充不是'需要吗?

我的建议是使用随机非ascii 字符填充。

然后取消填充只是检查最后一个字符是否为非ascii,rstrip是否为它,否则保持不变。

import string,random

def padding(message):
    padding = chr(random.randint(1,31))
    extra = len(message) % 16
    if extra > 0:
        message += padding * (16 - extra)
    return message

def unpadding(message):
    last_char = message[-1]
    if ord(last_char) < 32:
        return message.rstrip(last_char)
    else:
        return message

p = padding("hello guys")
print(unpadding(p))

答案 1 :(得分:1)

假设您希望打印填充字符串并仅使用ASCII字符,则应将填充方案修改为可唯一解码。

在其他领域中有几种这样的方案,例如加密,您必须完成一条消息以适应基础算法的确切块大小。

但为什么要选择填充?

  • 是否必须是随机的?

  • 是否必须是一封信?

如果没有,请查看PKCS#7的示例。 在那里,您可以添加整个字节来填充消息,但填充字节的值会更改。如果要添加一个字节,则为1;如果要添加两个字节,则为2,依此类推。 这可能是模糊的,它最后一个块已经完成,不需要任何填充。在这种情况下,添加整个填充块,其中字节等于B,其中B是块大小。您可以看到这是完全相同的逻辑:如果您读取了消息的最后一个字节(字符),那么它会告诉您必须删除多少字节。

如果你必须使用字母,并且因为你的填充最多为16,那么你可以使用从“A”到“P”的字母。

以下是一个例子:

def nToChar(n):
if n < 0 or n > 16:
    return ""
else:
    return chr(n + ord("A") - 1)

def charToN(char):
    if char <= "A" or char >= "P":
        return 0
    else:
        return ord(char) - ord("A") + 1

def padding(message):
    lastBlockSize = len(message) % 16 
    padLength = 16 - lastBlockSize  
    pad = nToChar(padLength) * padLength
    return message + pad

def unpadding(message):
    padChar = message[-1]
    nToRemove = charToN(padChar)
    nToReturn = len(message) - nToRemove
    return message[0:nToReturn]