Skip to content

RRRRUDDDD/FontEncrypt_Sigil

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

32 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

FontEncrypt

Sigil EPUB 编辑器插件 -- 对 EPUB 中的主文本部分进行字体混淆加密,小幅度提高破解难度

功能

  • 对选定章节的 CJK 正文进行字体混淆加密
  • 按章节动态收集实际出现的字符,仅混淆所需字符,避免字体过大或码位不足
  • 全角字符(汉字、全角标点)映射到 CJK 码位,半角字符映射到 BMP PUA 区,保持排版宽度一致
  • 自动生成随机映射的 TTF 字体文件,支持复合字形分解
  • 自动注入 @font-face CSS 规则到已有样式表(全局统一类名,避免冗余)
  • 支持排除特定 HTML 元素(标题、脚注、脚本、样式、代码块等)不参与混淆,Emoji 字符自动跳过
  • 多看阅读兼容:自动注入 U+7684(的)字形,确保多看正确识别为 CJK 字体

注意: 使用前请确保 EPUB 正文没有内嵌字体。如果正文已通过 CSS 指定了内嵌字体,内嵌字体会覆盖插件生成的加密字体,导致混淆后的文本无法正常渲染。请先移除正文的内嵌字体设置,再运行插件。

原理

  1. 读取字体 (本项目默认使用梦源黑体)(优先使用默认字体,随意更换字体可能导致未知问题),提取 CJK 字符的字形数据(自动分解复合字形)
  2. 按字符宽度分类:全角字符分配 CJK 扩展区码位,半角字符分配 PUA 私有区码位
  3. 构建新字体:新码位 -> 原字符字形
  4. 将 HTML 正文字符替换为新码位的 Unicode 字符
  5. 注入 @font-face CSS 使新字体生效
  6. 阅读器加载自定义字体正常显示,源码中只有随机码位

全角/半角分离映射

插件会自动判断每个字符的 East Asian Width 属性:

  • 全角字符 (W/F):汉字、全角标点等 -> 映射到 CJK 统一汉字区 (U+3400-U+4DBF, U+4E00-U+9FFF)
  • 半角字符:ASCII 标点、拉丁字母等 -> 映射到 BMP 私有使用区 (U+E000-U+F8FF)

这样确保混淆后的字符在各阅读器中保持与原字符一致的显示宽度,避免标点间距异常。

多看阅读器兼容

多看阅读器通过检测 U+7684("的")码位是否有字形来判断字体是否为 CJK 字体。插件会自动将"的"字的字形注入到生成的混淆字体中(即使正文不包含"的"字),确保多看正确加载字体并显示正文。

XHTML 处理策略

插件采用混合策略处理 XHTML:

  1. DOM 路径(主路径):使用 ElementTree 解析 XHTML,在 DOM 节点级别执行文本翻译(只修改 .text.tail,不触及 HTML 属性)。自动跳过 <script><style><code><pre> 等标签的内容。只序列化 <body> 元素并拼接回原始字符串,保留声明头、<html> 属性、<head> 区域和命名空间声明的原始格式。
  2. 正则回退路径:对于 XML 解析失败的格式异常 XHTML,使用简化的正则方案,只翻译标签之间的文本内容。同样保护 <script>/<style>/<code>/<pre> 块不被翻译。

排除混淆的 HTML 元素

插件通过标签名和 class 属性判断保护特定 HTML 元素不参与字体混淆。被排除的元素内容保持原文不变。

当前排除规则

规则 匹配示例
<h1> - <h6> <h2>第一章</h2>
<script> <script>...</script>
<style> <style>...</style>
<code> <code>var x = 1;</code>
<pre> <pre>预格式化文本</pre>
classcut <p class="cut">...</p>
classint <p class="right int">...</p>
classspe <span class="spe">...</span>
class-Regular 结尾 <span class="FZKai-Regular">...</span>
classzhangyue-footnote 自闭合 img 标签
classduokan-footnote-item 含内部 <p> 的 li
Emoji 字符 自动跳过,不参与字符映射

如何添加自定义排除规则

编辑 plugin.py 中的以下常量:

# 需要排除的标签名
_EXCLUDE_TAGS = frozenset({'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'script', 'style', 'code', 'pre'})
# 需要排除的 class 值
_EXCLUDE_CLASSES = frozenset({'cut', 'int', 'spe', 'duokan-footnote-item', 'zhangyue-footnote'})
# 需要排除的 class 后缀
_EXCLUDE_CLASS_SUFFIX = '-Regular'

自定义混淆字符集

编辑 characters.txt 文件,添加或移除需要参与混淆的字符。每个字符直接排列,无分隔符。插件启动时会自动加载该文件。

安全性分析

加密强度

这是字体混淆,而非密码学加密。它通过自定义字体的码位重映射来隐藏明文,可以提高人工阅读和普通爬虫的破解成本,但无法对抗有针对性的逆向分析

可逆性

拥有的资源 是否可还原
字体 + HTML 可完全还原
仅 HTML,无字体文件 无法还原
仅字体文件,无 HTML 无意义

系统要求

  • Sigil 0.9.4+
  • Python 3.7+

About

Sigil plug-in: Chinese confusion encryption

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages

  • Python 100.0%