Sigil EPUB 编辑器插件 -- 对 EPUB 中的主文本部分进行字体混淆加密,小幅度提高破解难度
- 对选定章节的 CJK 正文进行字体混淆加密
- 按章节动态收集实际出现的字符,仅混淆所需字符,避免字体过大或码位不足
- 全角字符(汉字、全角标点)映射到 CJK 码位,半角字符映射到 BMP PUA 区,保持排版宽度一致
- 自动生成随机映射的 TTF 字体文件,支持复合字形分解
- 自动注入
@font-faceCSS 规则到已有样式表(全局统一类名,避免冗余) - 支持排除特定 HTML 元素(标题、脚注、脚本、样式、代码块等)不参与混淆,Emoji 字符自动跳过
- 多看阅读兼容:自动注入 U+7684(的)字形,确保多看正确识别为 CJK 字体
注意: 使用前请确保 EPUB 正文没有内嵌字体。如果正文已通过 CSS 指定了内嵌字体,内嵌字体会覆盖插件生成的加密字体,导致混淆后的文本无法正常渲染。请先移除正文的内嵌字体设置,再运行插件。
- 读取字体 (本项目默认使用梦源黑体)(优先使用默认字体,随意更换字体可能导致未知问题),提取 CJK 字符的字形数据(自动分解复合字形)
- 按字符宽度分类:全角字符分配 CJK 扩展区码位,半角字符分配 PUA 私有区码位
- 构建新字体:新码位 -> 原字符字形
- 将 HTML 正文字符替换为新码位的 Unicode 字符
- 注入
@font-faceCSS 使新字体生效 - 阅读器加载自定义字体正常显示,源码中只有随机码位
插件会自动判断每个字符的 East Asian Width 属性:
- 全角字符 (W/F):汉字、全角标点等 -> 映射到 CJK 统一汉字区 (U+3400-U+4DBF, U+4E00-U+9FFF)
- 半角字符:ASCII 标点、拉丁字母等 -> 映射到 BMP 私有使用区 (U+E000-U+F8FF)
这样确保混淆后的字符在各阅读器中保持与原字符一致的显示宽度,避免标点间距异常。
多看阅读器通过检测 U+7684("的")码位是否有字形来判断字体是否为 CJK 字体。插件会自动将"的"字的字形注入到生成的混淆字体中(即使正文不包含"的"字),确保多看正确加载字体并显示正文。
插件采用混合策略处理 XHTML:
- DOM 路径(主路径):使用 ElementTree 解析 XHTML,在 DOM 节点级别执行文本翻译(只修改
.text和.tail,不触及 HTML 属性)。自动跳过<script>、<style>、<code>、<pre>等标签的内容。只序列化<body>元素并拼接回原始字符串,保留声明头、<html>属性、<head>区域和命名空间声明的原始格式。 - 正则回退路径:对于 XML 解析失败的格式异常 XHTML,使用简化的正则方案,只翻译标签之间的文本内容。同样保护
<script>/<style>/<code>/<pre>块不被翻译。
插件通过标签名和 class 属性判断保护特定 HTML 元素不参与字体混淆。被排除的元素内容保持原文不变。
| 规则 | 匹配示例 |
|---|---|
<h1> - <h6> |
<h2>第一章</h2> |
<script> |
<script>...</script> |
<style> |
<style>...</style> |
<code> |
<code>var x = 1;</code> |
<pre> |
<pre>预格式化文本</pre> |
class 含 cut |
<p class="cut">...</p> |
class 含 int |
<p class="right int">...</p> |
class 含 spe |
<span class="spe">...</span> |
class 以 -Regular 结尾 |
<span class="FZKai-Regular">...</span> |
class 含 zhangyue-footnote |
自闭合 img 标签 |
class 含 duokan-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+