本文针对的是类似于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. 文心一言 VS chatgpt (4)-- 算法导论2.2 1~2题

    一.用O记号表示函数(n ^ 3)/1000-100(n^2)-100n十3. 文心一言: chatgpt: 可以使用大 O 记号表示该函数的渐进复杂度,即: f ( n ) = n 3 1000 − ...

  2. redis内存突然暴增,排查思路是什么

    1 这种暴增的应该还是上次一个群友说的,更多可能是外部因素导致的,应用新上线,定时任务这些,再有就是cat上查是哪些指令多,以及比对和之前的时间的差异 看是否有定时任务 或者 新上线的活动 ,在看下监 ...

  3. docker无法启动,报错grpc: addrConn.createTransport failed to connect to {unix:///run/containerd/containerd.

    docker无法启动,报错.k8s的pod镜像加载失败. 解法方法: 删除/var/lib/docker/和/var/lib/containerd/ 这两个文件夹,重起docker服务. 问题完美解决 ...

  4. 2021-04-18:给定一个二维数组matrix,里面的值不是1就是0,上、下、左、右相邻的1认为是一片岛,返回matrix中岛的数量。

    2021-04-18:给定一个二维数组matrix,里面的值不是1就是0,上.下.左.右相邻的1认为是一片岛,返回matrix中岛的数量. 福大大 答案2021-04-18: 并查集. 代码用gola ...

  5. C++面试八股文:指针占用多少个字节?

    某日小二参加XXX科技公司的C++工程师开发岗位4面: 面试官:memset.memcpy和strcpy的区别是什么? 小二:memset用于将一块内存设置为特定的值, memcpy用于将一块内存从一 ...

  6. flutter系列之:做一个会飞的菜单

    目录 简介 定义一个菜单项目 让menu动起来 添加菜单内部的动画 总结 简介 flutter中自带了drawer组件,可以实现通用的菜单功能,那么有没有一种可能,我们可以通过自定义动画来实现一个别样 ...

  7. 如何在2023年开启React项目

    在这里,我想给你一个新的React项目入门的简要概述.我想反思一下优点和缺点,反思一下作为一个开发者所需要的技术水平,反思一下作为一个React开发者,每个启动项目都能为你提供哪些功能.最后,你将了解 ...

  8. 【Clickhouse】ReplaceingMergeTree引擎final实现合并去重探索

    前言 在OLAP实践中,在有数据更新的场景中,比如存储订单数据,我们经常会用到ReplaceingMergeTree引擎来去重数据,以获取数据的最新状态.但是ReplaceingMergeTree引擎 ...

  9. Kubernetes 集群管理:Kurator or Kubespray

    摘要:Kubespray 和 Kurator 就是这类开源工具的典型代表.本文将对这两款工具进行比较. 本文分享自华为云社区<Kubernetes 集群管理:Kurator or Kubespr ...

  10. 【QCustomPlot】使用方法(动态库方式)

    说明 使用 QCustomPlot 绘图库辅助开发时整理的学习笔记.同系列文章目录可见 <绘图库 QCustomPlot 学习笔记>目录.本篇介绍 QCustomPlot 的一种使用方法, ...