# PDF 解锁

权限限制与打开密码不同。页面会说明你的 PDF 使用哪种保护。

> 在本地移除 PDF 权限限制，或移除你提供的打开密码。页面会先识别文件的保护类型，再请求密码。不上传内容，也不猜测密码。

This is an interactive browser tool at https://httcup.github.io/tools/unlock-pdf/. Files are processed on the device running that browser. Any deliberate sharing or optional network feature is described on the page. What follows is its written explanation; open the address to use it.

## Your 文档 are **processed in your browser**. No processing upload.

你选的那份文档，打开、解密、写回，全都在这台机器的内存里完成，用的是从这个地址发来的代码。这里根本没有能做上传的东西，这一页的另一头也没有服务器可以接收。文件不会离开这个标签页，你打进去的密码也不会。

- ✗ 不上传
- ✗ 不注册
- ✓ 断网可用
- ✓ 开源
- ✓ 文件留在你的设备上

## 怎么去掉 PDF 的密码或者那些限制

1. **选那份被保护的 PDF。** 选择一个文档。浏览器从磁盘读取它，首先尝试空密码。对于只限制权限、不要求密码即可阅读的文件，这样便能打开。
2. **看这一页找到了什么。** 它会说这个文件带的是两种保护里的哪一种、用的是什么方案、那个方案在今天值多少，并且列出这份文档请阅读器遵守的每一条限制：打印、复制、编辑、批注、填表单、调整页序，甚至朗读给看不见的人听。
3. **输密码，但只在它开口要的时候。** 密码框只在空密码没能打开这份文档的时候才出现，而那也是密码唯一有用的时候。文档的两个密码哪个都行，打开它的那个，或者解除限制的权限密码。这里什么都不猜，你打进去的东西也留在这个标签页里。
4. **去掉它，然后读那句写着「已核对」的话。** 文档会用它自己的密钥解密，再写回去，出来的文件里连加密字典都没有。接着做好的文件会在这里被重新打开一次，不给密码，用的是一个碰到加密文档就拒绝的读取器。要是它打不开，或者页数跟原来对不上，你不会拿到下载，只会拿到一句说明。

## The longer version

[如何解锁 PDF，先知道是哪种锁](https://httcup.github.io/tools/guides/unlock-a-pdf/): 不能打印与不能打开是两个问题。了解为何一个一键解决，另一个必须有密码，以及如何辨别。

## Also in the box

- [PDF 加密](https://httcup.github.io/tools/protect-pdf/): 把文档锁上，而不是为了锁它先把它交给一个网站。
- [PDF 水印](https://httcup.github.io/tools/watermark-pdf/): 一份写着自己去了哪里的扫描件，就没法悄悄再去别的地方。
- [PDF 涂黑](https://httcup.github.io/tools/redact-pdf/): 字从文件里删掉，然后再搜一遍这个文件来证明。
- [PDF 转 CSV](https://httcup.github.io/tools/pdf-to-csv/): 将检测到的 PDF 文本表格转换成电子表格可打开的行。

## Questions

### 我需要密码吗？

取决于保护类型。PDF 无需密码即可打开、但限制打印或复制时，可以在这里不输入密码就移除这些权限限制。若需要打开密码，请提供用户密码或所有者密码。页面先尝试空密码，再解释检测到的情况。

### 我没有密码的 PDF，它能打开吗？

不能。本工具不猜测密码，也不搜索加密密钥。可查看 `src/shared/pdf-crypt.js` 了解它如何处理提供的密码。其他恢复工具可能猜测弱密码或攻击过时加密，但不保证成功；本页面两者都不做。不知道有效密码时，请向发送者索取密码或可访问的副本。

### 两个密码有什么区别？

PDF 可以有两种密码。*用户*密码用于打开文档；*所有者*密码授予全部权限。文档可以设置所有者密码而将用户密码留空，此时能自由打开，但阅读器仍执行打印或复制限制。本工具接受你提供的任一种密码，并说明检测结果。

### 去掉这些限制合法吗？

这取决于是哪份文档、你在哪里，而且这是一个关于你对这个文件有什么权利的问题，不是关于技术的问题。能明说的是这个格式本身是怎么回事：那些限制是文档里面的一个字段，阅读器按约定去遵守它，它不是一道密码学的墙，而 Adobe 从它被引入的那天起就是这么写的。这个工具是给你有权使用的文档用的，你自己那份打不出来的对账单、你花钱买了却复制不了的报告、你需要重排页序的扫描件。如果这个文件本来就不该归你用，这里的任何东西都改变不了这一点。

### 它支持哪些加密方式？

公开发布过的每一种：40 位和 128 位的 RC4（修订 2 和 3）、AES-128（修订 4），以及 AES-256 的两种形态，2008 年那个后来被撤回的版本和当前 PDF 2.0 的版本（修订 5 和 6）。不支持的是基于证书的加密，那种情况下密钥属于一张智能卡或者一个密钥库而不是一个密码，另外还有 Adobe 那个唯一没有公开的变体。这两种都会被拒绝，并且说明它们分别是什么，而不是含糊地失败。

### 做完之后文档看上去会不一样吗？

不会。什么都不会被重新渲染、重新编码或者重排：每一页的绘制指令、每一个嵌入字体、每一张图片，都原样复制过去。文字还能选，扫描件还是原来的分辨率，什么都不会移位。文件可能会小一点，因为一次重写会把早先编辑留在里面、已经被取代的旧对象丢掉。

### 带签名的文档会怎么样？

它的签名会失效，而且没有办法绕过去。签名覆盖的是它当初签的那个文件的确切字节，所以任何改动，任何程序做的，包括当初签它的那个程序，都会让它失效。这正是签名的意义所在。这个工具写的是一个新文件，发现原件带签名时会在结果里说明。把你的原件留着：那一份仍然是签过名的。

### 我的文档或者密码会被上传到什么地方吗？

不会。文件是你自己的浏览器在你自己的硬件上读取、解密、写出的，密码进的是一段跑在这个标签页里的密钥推导。这个工具没有服务器那一端，页面的 `Content-Security-Policy` 列出了它可以联系的每一个地址，其中没有一个属于本站。最简单的验证办法，是把网线拔掉，照样用这一页。

### 我怎么知道保护真的没了？

因为这个工具会在你的机器上核对，并且把结果给你看。文件写好之后，它会被交给本站其他 PDF 工具用的同一个读取器，一个碰到加密文档就直接拒绝的读取器，而它必须在不给密码的情况下打开，并且页数跟原来一样。要是过不了，这次运行就报告为失败，什么都不会给你下载。你事后也可以自己验：用任何一个阅读器打开它，去看文档属性，那里每一项权限现在都应该写着「允许」。

### 有大小限制吗？要钱吗？

工具里没有写死任何限制。限制是你自己的机器：文档在处理的时候是放在内存里的，几百兆的量，一台笔记本吃得下，再往上就会吃力。它是免费的，不注册、不登录，也没有试用期。本站带广告，那是养活它的东西；广告拿不到任何关于你文档的内容。

### 断网能用吗？

能。把页面加载一次，然后断开网络，它照样能用。这也是证明什么都没被上传的最简单的办法：一个把你的文档发出去解锁的工具，你一拔网线它就停了。

## How the privacy claim is verifiable

- **页面区分权限限制和打开密码。** 一份 PDF 可以带着两种完全不同的东西。*打开密码*是真的：没有它，这个文件谁都读不了，这里也找不出来。*限制*，不许打印、不许复制、不许编辑，则不是。只带着限制的文件谁都打得开，这就意味着它必须自己装着推导出自身密钥所需要的一切，因为你的阅读器就是这么推出来的。真正拦着阅读器不让打印的，是文档里面的一个权限字段，靠的是行为端正的程序之间的约定。Adobe 从一开始就是这么写的。把它去掉不是在破解什么，只是不再自愿配合。这一页会告诉你手上是两种里的哪一种，并且只在真的需要密码的时候才开口要。
- **它不猜密码，里面也没有哪个循环能拿来猜。** 如果一份文档有打开密码，那要么你给出来，要么它就一直关着。这里没有字典，没有词表，也没有去碰 1990 年代那种真的搜得出来的 40 位密钥。这是一条故意划下的线，不是谁没顾上补的缺口：一个悄悄替你试上几百万个密码的页面，是另一个名字的另一个工具，不是这一个。打开文档的那个密码，和解除限制的权限密码，两个都收，因为不管哪一个，都是别人给你的密码。
- **密码在这里打进去，也在这里用掉。** 你打进去的东西进的是一段跑在这个标签页里的密钥推导，别处都不去。它不会被存下来，不会在两个文件之间被记住，也不会被写进地址栏；页面的 `Content-Security-Policy` 列出了这一页可以联系的每一个地址，其中没有一个属于本站。一个工具问你要文档密码、然后发起一次网络请求，是这类工具能做的最坏的一件事。
- **做好的文件在交给你之前，会在这里重新打开一次。** 在那之前，上面这些话都只是这个工具在给自己判卷。所以那些马上就要变成你下载的字节，会被交给[压缩器](https://httcup.github.io/compress-pdf/)、[合并器](https://httcup.github.io/merge-pdf/)和[涂黑工具](https://httcup.github.io/redact-pdf/)用的同一个读取器，一个碰到加密文档就直接拒绝的读取器，而它必须在不给任何密码的情况下打开，并且页数跟原来一样。一个还带着任何加密的文件是过不了这一关的。过不了，这次运行就报告为失败，也不会有下载。
- **页面本身不会被重新渲染、重新编码，也不会重排。** 变的是文档外面那层加密，不是文档。每一页的绘制指令、每一个嵌入字体、每一张图片，都按原样写回去，所以文字还能选、还能搜，扫描件还是扫描时的分辨率，页面上什么都不会移位。唯一会变的是任何一次重写都会变的东西：早先编辑留下的、已经被取代的旧对象不再带过来，通常还会让文件小一点。
- **数字签名过不了这一关，有签名的时候页面会说。** 签名覆盖的是它当初签的那个文件的确切字节，所以任何重写都会让它失效，这正是签名的用处。这个工具写的是一个新文件，所以你拿回去的那份是没有签名的；发现文件带着签名时，它会在结果里说明。你的原件仍然是那份签过名的。这件事没有绕过去的办法，也没有哪个工具有。
- **它会说那层保护到底值多少。** 一份 1998 年用 40 位 RC4 锁上的文档，和一份去年用 AES-256 锁上的文档，在阅读器里都写着「已加密」，而它们之间差了几十年。这一页会说出方案、密钥长度和修订号，并且直说其中哪些早就被攻破、哪些只是过时、哪一个还是当前的。对一份别人告诉你「很安全」的文件来说，这值得知道，而没有哪个阅读器会摆给你看。
- **用证书锁的文档会被直接拒绝，而不是半开着。** 有些文档是加密给一张证书而不是一个密码的，企业里那种，密钥放在智能卡或者密钥库里。这些会被拒绝，并且说明它们是什么。密码框里打什么都代替不了一把私钥，假装可以只是浪费你的时间。
- **Google 加载了什么，又没拿到什么。** 广告和统计脚本来自 Google。这两个都没有拿到关于你文档的任何东西：不是文件，不是某一页，不是文件名、大小、页数、密码，也不是这个文件被什么保护着。每一行读取、解密或者写出 PDF 的代码都由这个源站发出，并且列在代码仓库里。
- **打赏按钮加载了什么，又没拿到什么。** 页眉上那个「Buy me a coffee」按钮，是由 cdnjs.buymeacoffee.com 的一段脚本画出来的，字体取自 Google Fonts。它就是一个链接，仅此而已：它不上报访问，也拿不到任何关于你或者你文档的东西。你不点它就什么都不会发生，而点下去要去的是别人的网站。
- **断网也能用。** 把网络断掉，这一页上的所有功能照常。这是最简单的一个证明：一个把你的文档发出去解锁的工具，这时候就停了。

**Check it yourself.** None of the above has to be taken on trust. This page is generated from the templates and config in the repository by a build script you can read and run yourself, and the result is committed to the `dist` branch — so you can diff what is served against what a build of the sources produces: https://github.com/httcup/tools

The files worth reading first are `config/site.toml` for the Content-Security-Policy，一个密码是怎么变成文档密钥的，以及那里面根本没有循环这件事，看 `src/shared/pdf-crypt.js`；两种密码算法本身在 `src/shared/aes.js` 和 `src/shared/rc4.js`。这几个都够不着网络，旁边负责读和写的部分也一样。
