本文针对的是类似于sarasa-shuffle.woff2加密字体的一个研究。

字体加密是使用Unicode编码将其映射到不同的字体显示的一种前端显示加密手段。在反爬虫中能够起到较好的效果,爬虫将只能得到sarasa字体的乱码文本。本文将以sarasa-shuffle.woff2字体为例讲解如何破解这种类型的加密字体。

1、sarasa-shuffle.woff2字体

可以使用FontCreator软件查看该字体:



字体的构成有三个部分:camp code、Unicode码以及字体本身。

比如图中这个的Unicode是62CE,campcode是25294,这些是在sarasa-shuffle.woff2定义的。我将这个字体通过OCR代码转换,得到这样的两组对应关系:

{
...
"25285": "绚",
"25292": "剑",
"25293": "骑",
"25294": "母",
...
}
{
...
"uni62CD": "骑",
"uni62CE": "母",
"uni62D0": "羊",
"uni62D2": "者",
...
}

2、将乱码句子使用上述对应关系进行转义

下面这段代码可以用来翻译一段sarasa-shuffle加密的句子,将其翻译成非'乱码'形式的字体,Windows常用对应字体。这样就可以得到一组人眼可以分辨的正常文本。

def convert2normal(encode_str):
ret = ''
for ch in encode_str:
str_res_key = ch.encode("unicode_escape").decode().strip("\\u")
try:
value = cmap_code_word["uni" + str_res_key.upper()]
except KeyError as e:
value = ch
ret = ret + value
return ret

3、遇到类似的加密字体解决流程

使用下面这段代码去OCR识别这种字体,OCR工具是ddddocr,国内开源的一个库,识别率还可以。

def identify_word(_ttf_path):
"""识别ttf字体结果"""
font = TTFont(_ttf_path)
ocr = ddddocr.DdddOcr()
dict_data1 = {}
dict_data2 = {}
for cmap_code, glyph_name in font.getBestCmap().items():
bytes_io = BytesIO()
pil = font_to_img(cmap_code, _ttf_path)
pil.save(bytes_io, format="PNG")
word = ocr.classification(bytes_io.getvalue()) # 识别字体
dict_data1[glyph_name] = word
dict_data2[str(cmap_code)] = word
# print(cmap_code, glyph_name, word)
# with open(f"./img/{cmap_code}_{glyph_name}.png", "wb") as f:
# f.write(bytes_io.getvalue())
# 将打印出来的字典数据直接粘贴到一个新的文件中,使用"替换' ——CmapCode2word.json和GlyphName2word.json文件生成的方式
print(dict_data1)
print(dict_data2)

注意,务必使用print的方式将对应关系打印出来,再粘贴到文件中,直接文件写会出编码问题。

项目代码和编码文字对应关系已经开源在github上,https://github.com/flowerlake/sarasa-deshuffle

针对sarasa-shuffle.woff2加密字体进行解密的更多相关文章

  1. Java 前端加密传输后端解密以及验证码功能

    目录(?)[-] 加密解密 1 前端js加密概述 2 前后端加密解密 21 引用的js加密库 22 js加密解密 23 Java端加密解密PKCS5Padding与js的Pkcs7一致 验证码 1 概 ...

  2. SQLPROMPT5.3对各种加密对象的解密测试

    SQLPROMPT5.3对各种加密对象的解密测试 测试环境: SQL2005个人开发者版 SP4 SQLPROMPT版本:5.3.8.2 视图 CREATE VIEW aa WITH ENCRYPTI ...

  3. C# 与JAVA 的RSA 加密解密交互,互通,C#使用BouncyCastle来实现私钥加密,公钥解密的方法

    因为C#的RSA加密解密只有公钥加密,私钥解密,没有私钥加密,公钥解密.在网上查了很久也没有很好的实现.BouncyCastle的文档少之又少.很多人可能会说,C#也是可以的,通过Biginteger ...

  4. des加密解密——java加密,php解密

    最近在做项目中,遇到des加密解密的问题. 场景是安卓app端用des加密,php这边需要解密.之前没有接触过des这种加密解密算法,但想着肯定会有demo.因此百度,搜了代码来用.网上代码也是鱼龙混 ...

  5. C#DES加密,JavaDES解密,另转C#和Java实现Des完整代码

    C#DES加密,JavaDES解密,另转C#和Java实现Des完整代码 转载 2014年06月17日 17:36:09 标签: DES / C#DES / JavaDES / C#和Java交叉DE ...

  6. php简单混淆类加密文件如何解密?

    最近在整理单位购买的源码时,发现源码里好多文件都混淆加密了.虽然不解密也不影响使用,但是心里总觉得有些别扭,便试着将加密的文件解密. 首先,百度了一下,看网上是否有现成的混淆类解密工具,搜到了一个ht ...

  7. 解决IIS部署网站引用woff/woff2/svg字体报404错误

    一.问题 在IIS上部署网站,网页引用woff字体时,浏览器报“找不到woff.woff2字体”.“404”错误,不仅预设的字体加载不出来,还影响网页加载速度. 二.原因 IIS默认设置情况下不识别. ...

  8. C# 利用ICSharpCode.SharpZipLib实现在线加密压缩和解密解压缩 C# 文件压缩加解密

    C# 利用ICSharpCode.SharpZipLib实现在线加密压缩和解密解压缩   这里我们选用ICSharpCode.SharpZipLib这个类库来实现我们的需求. 下载地址:http:// ...

  9. localStorage在不同页面之间的设置值与取值--加密 localStorage与解密localStorage

    在aa.vue页面 <template> <div> <h1>在aa页面设置值</h1> <button @click="shezhi& ...

  10. Delphi RSA加解密【 (RSA公钥加密,私钥解密)、(RSA私钥加密,公钥解密)、MD5加密、SHA加密】

    作者QQ:(648437169) 点击下载➨delphi RSA加解密 [Delphi RSA加解密]支持 (RSA公钥加密,私钥解密).(RSA私钥加密,公钥解密).MD5加密.SHA1加密.SHA ...

随机推荐

  1. 2021-10-29:除自身以外数组的乘积。给你一个长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之

    2021-10-29:除自身以外数组的乘积.给你一个长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i ...

  2. Selenium - 元素操作(4) - alert弹窗处理

    Selenium - 元素操作 alert弹窗 Alert弹出框由于不是html的页面元素,而是JavaScript的控件:所以不能右键检查,用传统的方法去操作. 例如这种弹窗: # 获取告警弹框的文 ...

  3. Actor Prioritized Experience Replay

    论文宗旨: 由于PER 是以TD-error成正比的非均匀概率进行抽样的,但是在AC算法中即连续动作空间中,会表现出低效果. 分析结果是:Actor不能有效的从high TD-error的transi ...

  4. 【论文笔记】Deeplab系列

    [深度学习]总目录 DeepLab系列是谷歌团队提出的一系列语义分割算法.DeepLab v1于2014年推出,随后2017到2018年又相继推出了DeepLab v2,DeepLab v3以及Dee ...

  5. PHP编程与系统开发

    PHP开发环境配置 一.开发环境 1.XAMPP或LNMP.WNMP,先安装widows版本的XMAPP-5.6版本(PHP 5.6) 2.VSCode:微软开发的集成开发环境(IDE) 二.安装教程 ...

  6. antd 在webpack.config配置主题色

    虽然官方提供了craco-less 来 覆盖less-loader 提供的 less 变量,但自己也想试着修复config来配置一下 首先需要运行 yarn eject 来暴露webpack的配置 其 ...

  7. Request header field userRole is not allowed by Access-Control-Allow-Headers in preflight response.

    今使用axios 请求数据过程中遇到同事设置的请求头,在我请求的接口中部不被允许,于是老是提示Request header field userRole is not allowed by Acces ...

  8. ArcMap手动新建矢量要素的方式

      本文介绍在ArcGIS下属ArcMap软件中,新建点.线.面等矢量要素图层,并对新建图层的空间范围加以划定的方法.   首先,在右侧"Catalog"栏中选择需要存放新建立矢量 ...

  9. QT 绘制波形图、频谱图、瀑布图、星座图、眼图、语图

    说明 最近在学中频信号处理的一些东西,顺便用 QT 写了一个小工具,可以显示信号的时域波形图.幅度谱.功率谱.二次方谱.四次方谱.八次方谱.瞬时包络.瞬时频率.瞬时相位.非线性瞬时相位.瞬时幅度直方图 ...

  10. /etc/netplan/network-manager-all.yaml 配置服务器ip

    本文为博主原创,转载请注明出处: /etc/netplan 是用于配置 Ubuntu 系统网络接口的目录.在 Ubuntu 中,网络配置的默认工具为  Netplan,而 /etc/netplan 则 ...