我使用填充功能:
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。
答案 0 :(得分:2)
您展示的功能的棘手部分是它们使用chr
和ord
分别对填充字符的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]
。我没有看到任何理由,因为这两个表达式完全相同(获取最后一个字符)。