首页 > 技术文章 > python如何在加解密过程中转储字节而避免转义符问题

Ziggy29 2021-06-02 20:18 原文

python如何在加解密过程中转储字节

没啥用的前言

最近在做文件加解密的东西,加密流程是原文件->base64字节->加密字节->str字符串->加密文件,解密过程是加密文件->str字符串->解密字节->base64字节->解密文件.

怪怪的问题

解密过程中遇到一个问题,加密文件中byte样式的str在转为byte字节时,转义符'\'会再次被转义,就遇到了下面这种情况

old_bytes = b"=\x1di\xab\xc1~)]9H\xdf\x0c\x7f`f&'\xfbooX}kX\x0e~D\x9d\x88\x83\x0f\xb8\xe7\xf6\x0f+\x97\xfc8+\xe5\xd4\xb9uC\xc0\xcdh\xa2S=|\xb5\xf9\xc59\xc0R#\xfaGR\xddMa\x8e\x9cS\xf9\xcdq\xbd\xb8_\x94\xa2\x8e\x13I\xbc\x0e\xcf\x82\xeeG\x85\xafBj\xe9\x0e\xd7\xd9\x0fj\x15\x06IY\xaf\xde\xee"
new_bytes = b'b"=\\x1di\\xab\\xc1~)]9H\\xdf\\x0c\\x7f`f&\'\\xfbooX}kX\\x0e~D\\x9d\\x88\\x83\\x0f\\xb8\\xe7\\xf6\\x0f+\\x97\\xfc8+\\xe5\\xd4\\xb9uC\\xc0\\xcdh\\xa2S=|\\xb5\\xf9\\xc59\\xc0R#\\xfaGR\\xddMa\\x8e\\x9cS\\xf9\\xcdq\\xbd\\xb8_\\x94\\xa2\\x8e\\x13I\\xbc\\x0e\\xcf\\x82\\xeeG\\x85\\xafBj\\xe9\\x0e\\xd7\\xd9\\x0fj\\x15\\x06IY\\xaf\\xde\\xee"'

一直解决不出的原因

  1. 转义字符\有点怪
  2. 文件里write只能写str
  3. 我有点sb

绕来绕去的解决方案

参考python bytes转str提示utf-8错误_Python bytes 反斜杠转义问题解决方法_从夏的博客-CSDN博客)解决了,原理是使用切片截掉开头的b',再用 codecs.escape_decode 来进行反斜杠转换。

文章里给的样例是这样

old_bytes = b"=\x1di\xab\xc1~)]9H\xdf\x0c\x7f`f&'\xfbooX}kX\x0e~D\x9d\x88\x83\x0f\xb8\xe7\xf6\x0f+\x97\xfc8+\xe5\xd4\xb9uC\xc0\xcdh\xa2S=|\xb5\xf9\xc59\xc0R#\xfaGR\xddMa\x8e\x9cS\xf9\xcdq\xbd\xb8_\x94\xa2\x8e\x13I\xbc\x0e\xcf\x82\xeeG\x85\xafBj\xe9\x0e\xd7\xd9\x0fj\x15\x06IY\xaf\xde\xee" # 这是bytes类型
old_str = str(old_bytes) # 这是str类型
new_bytes = bytes(old_str[2:-1], encoding="utf-8") # 这是bytes类型
import codecs
original = codecs.escape_decode(new_bytes, "hex-escape")
print(old_bytes, original)
print(original[0] == old_bytes)

输出:

b"=\x1di\xab\xc1~)]9H\xdf\x0c\x7f`f&'\xfbooX}kX\x0e~D\x9d\x88\x83\x0f\xb8\xe7\xf6\x0f+\x97\xfc8+\xe5\xd4\xb9uC\xc0\xcdh\xa2S=|\xb5\xf9\xc59\xc0R#\xfaGR\xddMa\x8e\x9cS\xf9\xcdq\xbd\xb8_\x94\xa2\x8e\x13I\xbc\x0e\xcf\x82\xeeG\x85\xafBj\xe9\x0e\xd7\xd9\x0fj\x15\x06IY\xaf\xde\xee" 
(b"=\x1di\xab\xc1~)]9H\xdf\x0c\x7f`f&'\xfbooX}kX\x0e~D\x9d\x88\x83\x0f\xb8\xe7\xf6\x0f+\x97\xfc8+\xe5\xd4\xb9uC\xc0\xcdh\xa2S=|\xb5\xf9\xc59\xc0R#\xfaGR\xddMa\x8e\x9cS\xf9\xcdq\xbd\xb8_\x94\xa2\x8e\x13I\xbc\x0e\xcf\x82\xeeG\x85\xafBj\xe9\x0e\xd7\xd9\x0fj\x15\x06IY\xaf\xde\xee", 273)
True

我们实际使用时取original[0]就可以咯

推荐阅读