记一次 unicode-escape 和 utf-8 编码的互解

记一次 unicode-escape 和 utf-8 编码的转换

是这样的,我在做 CTF 题的 RC4 编码时遇到一个 base64 加密后输出的密文:

mg6CITV6GEaFDTYnObFmENOAVjKcQmGncF90WhqvCFyhhsyqq1s=

.
.
直接 base64 解密后发现输出的是:

b"\x9a\x0e\x82!5z\x18F\x85\r6’9\xb1f\x10\xd3\x80V2\x9cBa\xa7p_tZ\x1a\xaf\x08\\xa1\x86\xcc\xaa\xab["
在这里插入图片描述

.
.
9a 在 utf8 中是 \xc2\x9a,所以这不是 UTF8 的 byte 编码,ascii 码是 128 内的,那猜想是 unicode-escape 编码,解密后输出能显示的字符如下:(这是正确的 RC4 加密后的显示,中间过程就不说了)

6’9±fÓV2Ba§p_tZ▒\¡Ìª«[
在这里插入图片描述

.
.
拿到了正确的解密后我很好奇它的 base64 密文是怎么生成出来的,就出现了下面喜剧性的一幕:

print(base64.b64encode((base64.b64decode(‘mg6CITV6GEaFDTYnObFmENOAVjKcQmGncF90WhqvCFyhhsyqq1s=’)).decode(‘unicode-escape’).encode(‘unicode-escape’)))
在这里插入图片描述

.
.
上面代码的意思就是 ‘unicode-escape’ 解码后再用 ‘unicode-escape’ 编码回来,但是结果是不一样的!!!(竟然不是对称操作,多了个反斜杠号)

a=b"\x9a\x0e\x82!5z\x18F\x85\r6’9\xb1f\x10\xd3\x80V2\x9cBa\xa7p_tZ\x1a\xaf\x08\\xa1\x86\xcc\xaa\xab["
.
print(a.decode(‘unicode-escape’).encode(‘unicode-escape’))
这里是引用

.
.
很明显 b"\\x9a" 这才是正宗的 unicode-escape 编码,关键就是一开始的 b"\x9a" 出题者是怎么搞出来的???
经过不断调试我发现可以 utf-8 解码可以把 unicode-escape 的 b"\\x9a" 输出成 b"\x9a" ,但是是字符串类型的结果:

b=b"\\x9a\\x0e\\x82!5z\\x18F\\x85\\r6'9\\xb1f\\x10\\xd3\\x80V2\\x9cBa\\xa7p_tZ\\x1a\\xaf\\x08\\\\\\xa1\\x86\\xcc\\xaa\\xab["
.
print(b.decode(‘utf-8’))
.
print(str(b,‘utf-8’))
在这里插入图片描述

.
.
然后经过了很多次尝试,我发现还是不能用命令的形式转成同样字符的 bytes 类型,只能手动加个 b 前置这样,加密后的结果终于对得上了:

c=b"\x9a\x0e\x82!5z\x18F\x85\r6’9\xb1f\x10\xd3\x80V2\x9cBa\xa7p_tZ\x1a\xaf\x08\\xa1\x86\xcc\xaa\xab["
.
print(base64.b64encode( c ))
在这里插入图片描述

.
.
做完上面的实验后我感觉编码之间前 128 个字符都可以互相解码,结果是一样的,因为要兼容 ASCII 码。但是 128 之后的字符解码出来的结果就不同了。
当然这是 python3 中才有用的,因为 unicode 编码在 python2 中是 u 前缀的。

首先尝试用 unicode-escape 解码单斜杠 ’ \ ’ 的 utf-8,解码结果不同:

d=b"\xc2\x9a"
.
print(d.decode(‘utf-8’))
.
print(d.decode(‘unicode-escape’))
在这里插入图片描述

.
.
再尝试用 utf-8 解双斜杠的 unicode 编码,发现 utf-8 不能解码 unicode-escape ,只能去掉其一个斜杠并作为字符串输出来:

e=b"\\x9a"
.
print(e.decode(‘utf-8’))
.
print(e.decode(‘unicode-escape’))
在这里插入图片描述

.
.
好了,分析到这了,里面的编码原理以我现在的水平还不能拿解释。。。后会有期!

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沐一 · 林

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值