这个Padding函数如何工作

时间:2014-04-14 22:31:24

标签: python aes padding

我使用填充功能:

def _pad(self, s):
    return s + (self.bs - len(s) % self.bs) * chr(self.bs - len(s) % self.bs)

def _unpad(self, s):
    return s[:-ord(s[len(s)-1:])]

由于这里缺乏语法和模数技巧,我不知道这一点。对于AES CBC en / decryption,填充和取消填充消息的这种赌注是什么?或者你会推荐一个不同的功能吗?

self.bs是blocksize,默认为32。

1 个答案:

答案 0 :(得分:2)

您展示的功能的棘手部分是它们使用chrord分别对填充字符的ASCII值中应用的填充量进行编码,以对值进行编码和解码。这很聪明。它确实需要填充所有字符串,即使长度已经是self.bs的精确倍数。

这是两个函数的更清晰版本,其中明确拆分了不同的步骤:

def _pad(self, s):
    amount_of_padding = self.bs - len(s) % self.bs   # between 1 and self.bs, inclusive
    padding_char = chr(amount_of_padding)            # encode amount_of_padding in ASCII!
    return s + amount_of_padding * padding_char      # do string repetition with *

def _unpad(self, s):
    padding_char = s[-1]                     # last char is always part of the padding
    amount_of_padding = ord(padding_char)    # decode amount from ASCII value of char
    return s[:-amount_of_padding]            # slice to skip padding chars

原始代码中唯一奇怪的事情是_unpad,他们使用的是s[len(s)-1]而不是s[-1]。我没有看到任何理由,因为这两个表达式完全相同(获取最后一个字符)。