我正在使用PyCrypto,我似乎成功地解密了我的数据.但是,我收到的字符串似乎表现得很奇怪:
...
plaintext = cipher.decrypt(encrypted)
print 'plaintext length is %u' % len(plaintext)
print 'plaintext: %s' % plaintext
print 'plaintext is "%s"' % plaintext
Run Code Online (Sandbox Code Playgroud)
明文有我期望的字符串("POEorOPE"),但输出似乎很奇怪:
plaintext length is 16
plaintext: POEorOPE
plaintext is ""OEorOPE
Run Code Online (Sandbox Code Playgroud)
为什么第三个print语句中的字符串似乎占用零空间,因此它的第一个字符被我认为的结束引号覆盖?我现在用明文存储的内容还有其他什么吗?
编辑:
感谢您的评论,我看到了正在发生的事情.(虽然为什么我的字符串中有退格字符,我不知道.)
print repr(plaintext)
'POEorOPE\x08\x08\x08\x08\x08\x08\x08\x08'
Run Code Online (Sandbox Code Playgroud)
结果这些退格字符是Perl 的 Crypt::CBC 模块添加的字节填充。在这种特殊情况下,填充字节都是“08”,表示有 8 个字节的填充应该被删除。PyCrypto 在解密或加密期间不处理填充。我可以像这样去除填充字节:
text_bytes = bytearray(plaintext,'utf-8')
num_bytes_padding = text_bytes[len(text_bytes) - 1]
text_bytes[-1 * num_bytes_padding:] = []
plaintext = text_bytes.decode('utf-8')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
309 次 |
| 最近记录: |