【问题标题】:How does this Padding Function work这个填充函数是如何工作的
【发布时间】:2014-05-29 02:09:39
【问题描述】:

我使用了一个 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 加密/解密填充和取消填充消息的最佳实践吗?或者您会推荐其他功能吗?

self.bs为blocksize,默认为32。

【问题讨论】:

    标签: python aes padding


    【解决方案1】:

    您展示的函数的棘手部分是,它们使用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]。我看不出有什么原因,因为这两个表达式的作用完全相同(获取最后一个字符)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-17
      • 2016-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多