我正在尝试创建一个从字符串中删除填充字符的函数。
基本上我有两个python脚本,
我已经有了一个插入填充的函数,如下所示:
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
感谢您的帮助。
答案 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]