记一次 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’))

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

记一次 unicode-escape 和 utf-8 编码的互解相关推荐

  1. Java编码ASCII、GB2312、GBK、Unicode、UTF-8、UTF-16 编码方式详解

    1 ASCII American Standard Code for Information Interchange.最早最通用的单字节编码系统,因为发明时间早,所以ASCII编码表的设计较为简单. ...

  2. 汉字编码(【Unicode】 【UTF-8】 【Unicode与UTF-8之间的转换】 【汉字 Unicode 编码范围】【中文标点Unicode码】【GBK编码】【批量获取汉字UNICODE码】)

    参考博客: Unicode与UTF-8互转(C语言实现):http://blog.csdn.net/tge7618291/article/details/7599902 汉字 Unicode 编码范围 ...

  3. 计算机编码方式详解(Unicode、UTF-8、UTF-16、ASCII)

    整理这篇文章的动机是两个问题: 问题一: 使用Windows记事本的"另存为",可以在GBK.Unicode.Unicode big endian和UTF-8这几种编码方式间相互转 ...

  4. Unicode中UTF-8与UTF-16编码详解

    概述 本文通过介绍Unicode编码以及对应的两种编码方式UTF-8和UTF-16,让读者能够了解关于字符串编码的相关知识,同时能够弄清楚Unicode和UTF-8和UTF-16之间的关系. 本文的主 ...

  5. 关于Unicode,UTF-8,GB编码详解

    内容来自网络, 有部分修正 一.首先我们需要明白关于字符(character),字符集(character set),字符编码方式(character encoding)的概念. 字符 :字符是抽象的 ...

  6. java ucs2转utf8_Windows下Unicode(UCS2),UTF8,GBK(GB2312)互转

    Windows下提供了两个编码转换函数:WideCharToMultiByte和MultiByteToWideChar. 用它们可实现Unicode(UCS2),UTF8,GBK(GB2312)互转. ...

  7. JS 字符串编码函数(解决URL特殊字符传递问题):escape()、encodeURI()、encodeURIComponent()区别详解

    JS 字符串编码函数(解决URL特殊字符传递问题):escape().encodeURI().encodeURIComponent()区别详解 参考文章: (1)JS 字符串编码函数(解决URL特殊字 ...

  8. js几种escape()解码与unescape()编码

    js几种escape()解码与unescape()编码 www.111cn.net 编辑:kepeer 来源:转载 一篇js几种escape()解码与unescape()编码函数,同时我们也和它和服务 ...

  9. Escape/Unescape,HTML实体编码,敲击码(Tap code),摩尔斯电码(Morse Code)

    1.Escape/Unescape 加密解码/编码解码,又叫%u编码,采用UTF-16BE模式, Escape编码/加密,就是字符对应UTF-16 16进制表示方式前面加%u.Unescape解码/解 ...

  10. Unicode 码和汉字,十进制之间互转!二进制、十六进制,十进制的转换

    2019独角兽企业重金招聘Python工程师标准>>> Unicode 码和汉字,十进制之间互转!二进制.十六进制,十进制的转换 用法文档这里就不介绍了!直接上代码 package ...

最新文章

  1. 解决烦人的img与input不能水平对齐的问题
  2. 【126】TensorFlow 使用皮尔逊相关系数找出和标签相关性最大的特征值
  3. hadoop map reduce自定义数据类型时注意顺序,否则报错。
  4. ionic安装及入门示例
  5. LazyInitializationException--由于session关闭引发的异常
  6. C语言 结构体 struct Cat cat1;
  7. python提取视频中的音频 代码_如何使用python从视频文件中提取音频?
  8. opencv 测试安装完成_opencv4.3 的安装(linux)
  9. 学生电脑哪个牌子好_电脑桌哪个牌子好?如何选购电脑桌?2020年值得选购的电脑桌品牌推荐...
  10. centos下使用yum命令安装php mcrypt扩展
  11. Spring Cloud中关于@EnableFeignClients注解的属性字段basePackages
  12. socket基本使用
  13. java常用的date类
  14. 如何让微信好友永远拉黑不了你?
  15. 【蓝桥杯单片机】共阳数码管
  16. Vue3 - 不再支持 IE11,到底为什么?
  17. APP安全的防护方法
  18. tkinter窗口美化功能介绍 第二章 怎么做圆角窗口
  19. 神经网络(二):Softmax函数与多元逻辑回归
  20. python刷微博转发_python刷新浪微博粉丝

热门文章

  1. 实现 EC20 4G模块PPP拨号上网
  2. Linux:邮箱客户端
  3. 《文明的冲突与世界秩序的重建》摘
  4. 事业公共基础计算机,2011安徽省事业编公共基础知识(必备资料)
  5. c++:从单例到内存屏障
  6. Python(28)---模块和包的基本概念
  7. python爬虫 抓取豆瓣电影 电影分类排行榜的所有数据
  8. Linux 配置SSH免密登录
  9. Kryo工具类 序列化和反序列化操作工具类KryoUtils
  10. 正整数分解使得乘积最大问题