移除 PDF 密碼
密碼留在你的鍵盤上,文件也一樣。
本機處理把檔案拖進來,或點擊選擇
支援 PDF。沒有大小上限,不用註冊。
這裡移除的是你本來就過得去的保護。它沒辦法幫你找回你手上沒有的密碼,也不會去試:不猜、不用字典、也不從擁有者密碼反推。
選一份你本來就打得開的 PDF,輸入它要的密碼,拿回一份不必密碼就打得開的複本。解密是在這個瀏覽器分頁裡跑的,所以文件與那組解開它的密碼都留在你自己的機器上,過程中沒有任何一步會把其中任何一樣送去別的地方。
同一個檔案裡有兩把鎖,只有一把會開口問你
一份有保護的 PDF,帶的可能是兩件完全不同的東西,而中文都叫它密碼。第一種是開檔密碼,也有人叫文件密碼或使用者密碼:沒有它,每一頁的位元組都還是密文,世界上任何閱讀器都顯示不出東西。第二種是擁有者密碼,也叫權限密碼或主密碼,它根本不管開不開得了檔,它管的是可不可以列印、可不可以複製文字、可不可以填表單這幾個旗標。
容易搞混的地方在於,只設了擁有者密碼的檔案仍然是全程加密的。標準安全處理器只是把開檔密碼記成空字串,所以每一個閱讀器都會安靜地解密,然後憑自己的良心決定要不要把列印按鈕變灰。它打開時沒有問你,不代表誰繞過了什麼,那本來就是這份檔案被發出來時的樣子。
這一頁在你選好檔案的當下就會告訴你手上是哪一種,不必先按任何按鈕,也不必先輸入任何東西。如果它說這份開檔不需要密碼,那麼密碼欄留空就是正確答案,不是投機取巧。
權限旗標是一種請求,不是一道牆
權限存在加密字典裡的一個整數,一個能力佔一個位元。閱讀器讀那個整數,然後決定自己要怎麼表現。它背後沒有任何密碼學上的強制力:頁面內容不管怎樣都會被解密,一個完全無視那個整數的閱讀器照樣能把文件渲染得好好的,而且真的有好幾個是這樣做的。
這件事值得講明白,因為它改變了移除擁有者密碼到底是什麼意思。那不是闖進任何地方,而是結束一個約定 —— 在那個約定裡,每一個守規矩的閱讀器都被要求假裝自己做不到某件它明明做得到的事。開檔密碼是真正的密碼學,這一頁也是這樣對待它的;權限整數從來都不是。
它也解釋了一個很常見的挫折:有人想從報告裡複製一段話,複製不到,於是認定檔案壞了,重新下載三次。檔案沒有壞。那只是某個旗標被設起來了,可能是好幾年前設的,也可能是由一套那個組織裡已經沒有人在維護的系統設的。
這個檔案其實一直記得你的密碼長什麼樣
為了在不儲存密碼的前提下驗證密碼,加密字典裡會放幾個推導出來的值:兩個叫做 O 與 U 的字串,用到 AES-256 時還會多兩個叫 OE 與 UE 的。它們是單向推導的結果,所以不是密碼本身,但它們正好就是一支猜密碼的程式所需要的材料 —— 丟一個候選進去、跑一次同樣的推導、比對結果。不需要文件、沒有次數限制、也沒有伺服器可以替你拖慢它。
大多數自稱解鎖工具的東西從來不會把那些值刪掉。它們只是讓檔尾不再指向那份加密字典,這樣檔案就打得開了,而字典本身還留在文件裡當一個沒有人參照的物件。結果就是:那份已解鎖的檔案打開時不必密碼,卻永遠帶著一份可以離線驗證你那組密碼的完整材料,而且會跟著這份複本傳給每一個收到它的人。考慮到有多少人十年來對同一個寄件者的所有帳單都用同一組密碼,這不是一點小殘留。
所以這一頁把它刪掉。安全處理器字典會被刪掉,任何還指著它的參照會被刪掉,還有一個很容易漏掉的東西也會:原檔那份已經作廢的交叉參照物件。有些函式庫解析不了它,於是原封不動整個抄進輸出,連同它自己那一句指向加密字典的參照一起抄過去。也正因為如此,輸出裡還有沒有 /Encrypt 這串字是一個壞判準而不是好判準。這裡真正的判準是另一件事:完成的複本會再用一支完全沒有解密程式碼的 PDF 函式庫重新打開一次。如果它其實還是加密的,那一步會失敗,而不是通過。
PDF 加密的四個世代,以及為什麼最老的那個還在到處出現
這個格式的安全處理器改版過四次,而四個世代的檔案到今天都還在流通。第 2 版用 RC4,金鑰 40 位元 —— 那個上限是 1990 年代密碼學出口管制訂出來的,不是誰的技術判斷。第 3 版仍然用 RC4,金鑰拉到 128 位元。第 4 版引進 AES-128。第 5 與第 6 版換成 AES-256,那也是現在的辦公室軟體預設寫出來的東西。
舊版之所以還在,是因為會產生帳單、發票與掃描檔庫的那些軟體,通常正好是一個組織最不想去動的軟體。一套繞著 2004 年函式庫寫成的帳務系統,這個月照樣在產出 RC4 文件;會議室那台事務機也會很開心地用它韌體多年前學會的方式加密。
這四種這一頁都處理得了,而且解完之後會把它找到的那一種寫出來。那不是裝飾。知道別人寄給你的文件是用 40 位元 RC4 保護的,是一個關於它到底曾經有多少保護的實用資訊。
把文件密碼打進一個網站,跟上傳一個檔案是兩種不同的賭注
這個站上關於不上傳的每一條理由在這裡都成立,然後還有一條只在這裡成立。當你把一份有保護的 PDF 上傳到某個轉檔網站,又在同一個表單裡輸入它的密碼,你等於在幾秒之內、用同一個請求,把密文與金鑰一起交給了同一台機器。加密原本對那台機器提供的保護,是被定義掉的,不是不小心失去的。
而且這種祕密特別容易跑得比預期遠。以表單欄位送出去的密碼,可能在沒有任何人做過決定的情況下,出現在存取紀錄、錯誤回報或當機傾印裡。它也很少是用過就丟的東西:同一組字串通常打得開同一個寄件者連續十二個月的帳單。
在這裡,密碼進到這個分頁裡的一個變數,交給早就隨頁面一起下載好的解密程式碼,然後在你關掉分頁的那一刻不再存在。要怎麼讓自己相信真的沒有東西送出去,那件事的一般作法寫在不上傳工具那一頁,這裡不重複。值得補的是這個不對稱:這個站上其他每一個工具,驗證不上傳的意思是確認一份你本來就有的檔案沒有離開;在這一頁,它同時是確認一個你剛剛打進去的祕密沒有離開,而後面那一項保證的價值比前面那一項高。
這一頁做不到的事,不繞圈子講
它打不開一份你沒有密碼的文件。這不是我們多花點力氣就能解除的限制。面對 AES-256 加上一組不在字典裡的密碼,已知的唯一途徑是一個一個試到對為止 —— 那正是專門的離線還原軟體在做的事,跑在為此挑選的硬體上,花上幾小時到幾星期。在有人開始討論這種東西該不該存在之前,一個網頁就已經是錯的形狀了。
我們沒有實作猜測,而這是一個決定,不是疏漏。一個會拿候選密碼去試任意文件的頁面,它最熱情的使用者,按照定義就不會是那些文件的主人。這裡劃的線是:你本來就有密碼,或者那份文件本來就不需要密碼才打得開。
另外兩件事做不到的原因跟政策無關。其他廠商疊在 PDF 之上的權限管理系統不是標準安全處理器,上面講的一切都碰不到它。還有,一份打不開的文件,是一份沒有人能替你描述的文件:如果某個檔案在這裡失敗了,這一頁沒有辦法告訴你到底是密碼錯了、檔案壞了,還是它從來就不是一份 PDF。
拿回來的那份複本,什麼變了、什麼沒變
頁面是照結構搬過去的,不是重新算繪一次。文字還是可以選取的文字,向量圖還是向量,嵌入的字型還在,路上也沒有任何一張圖被解碼後重新編碼。沒有世代損失,因為根本沒有東西被重新產生。
有兩樣東西一定會變。權限旗標會跟著存放它們的那份字典一起消失,那正是目的。還有,文件上任何數位簽章都會失效,因為簽章是對一段精確位元組序列所做的陳述,而這個操作產生的是另一段序列。那是簽章正常運作的樣子,不是缺陷:一個在檔案被改寫之後還活著的簽章,本來就一文不值。如果簽章正是這份文件重要的原因,請留著原檔,把解鎖後的複本當成工作用的副本。
檔案大小通常會小幅往任一個方向移動。加密過的串流壓不動,所以拿掉加密之後檔案可能變小;另一方面,重寫時物件的排布也可能沒有原本那個產生器那麼緊湊。
一組你本來就有權使用的密碼,通常放在哪裡
自動寄來的文件上的密碼,幾乎不會是一份一份單獨挑的。它們來自寄件方套用在所有人身上的一條規則,而那條規則幾乎一定寫在某個你本來就進得去的地方:那封通知信、上一期帳單的第一頁、帳戶入口網站的說明區,或是當初宣布改成電子帳單的那封信。
常見的長相有這幾種:帳號或卡號的末四碼、固定格式的出生日期、身分證號的一部分,或是拿掉空白的郵遞區號。如果某一種變化失敗了,通常錯的是格式而不是值,所以在下任何結論之前,先把同一組數字用有分隔符與沒有分隔符各試一次。
如果檔案是某個人寄的而不是某套系統寄的,那個人就是答案,而且問他比任何軟體能給你的都更快也更可靠。
台灣這邊實際會遇到的那幾種加密 PDF
這一段在英文版沒有對應內容,因為它講的是台灣本地的收件慣例。國內銀行的電子對帳單、信用卡帳單與信託對帳單,長年都是寄一份設了開檔密碼的 PDF,密碼規則寫在同一封通知信的下半部:常見的有身分證統一編號後六碼、出生月日四碼、帳號末五碼,或是這幾種的組合。壽險與產險的保單通知、電信業者的月租帳單也大多是同一套作法。
這些幾乎全部只設開檔密碼、沒有另外設權限限制,所以這一頁在你選檔之後會直接說這一份要先輸入密碼才打得開。把通知信上寫的那組填進去就結束了。反過來說,如果你選的是某些機關產出的公文或報表 PDF,而這一頁說它開檔不需要密碼、只是帶著權限鎖,那通常是產生系統預設把禁止複製打開了,跟你收到的信件內容無關。
另外兩件在台灣特別值得提醒的事。第一,身分證統一編號、出生年月日與帳號末幾碼都是個人資料保護法上的個人資料,把這類 PDF 連同密碼一起上傳到不知道機房在哪裡的網站,外洩的不只是那份帳單,還包括那條密碼規則本身,而那條規則對同一家機構寄給你的所有文件都有效。第二,報稅期間常見的所得資料下載檔與各種投保單位彙整表,如果是加密的,密碼一律以主管機關或該機構公告的規則為準;這一頁不會、也沒有辦法替你推測那條規則。
至於檔名,繁體中文檔名在這裡是安全的:解出來的複本會沿用原檔名再加上 -unlocked,不會被改成一串亂碼,因為整個過程都在你自己的瀏覽器裡,沒有經過任何一段會把檔名重新編碼的傳輸。
常見問題
我把密碼忘了,你們有辦法把文件打開嗎?
沒有辦法。沒有密碼,頁面內容就是密文;只要是用 AES 加密的,唯一的入口就是一個一個候選試到對為止。那是專門的密碼還原軟體在做的事,而且它需要檔案本身加上非常多的時間。這一頁的前提是你本來就有密碼,或者那份文件本來就不必密碼才打得開。
我輸入的密碼實際上跑去哪裡了?
跑進這個瀏覽器分頁裡的一個變數,然後交給隨頁面一起送來的解密程式碼。它不會被放進任何表單、不會跟著檔案送出去、也不會被存在任何地方;你關掉分頁就結束了。這件事沒有任何一步需要伺服器,所以也就沒有伺服器參與。
我的閱讀器打開這份 PDF 時什麼都沒問,為什麼這一頁說它有保護?
因為它帶的是擁有者密碼而不是開檔密碼。這個檔案是真的有加密,但開檔密碼是空的,所以閱讀器會安靜地解密,然後照它設的權限旗標行事。密碼欄留空,保護就會被拿掉。
這裡支援哪幾種 PDF 加密?
標準安全處理器的四個修訂版全部支援:40 位元金鑰的 RC4、128 位元金鑰的 RC4、AES-128 與 AES-256。解完之後這一頁會告訴你這個檔案原本用的是哪一種。其他廠商另外疊上去的權限管理機制屬於不同的東西,不在範圍內。
解出來的複本,看起來或讀起來會跟原檔不一樣嗎?
不會。頁面是照結構搬過去的,不是重畫,所以文字還是文字、向量還是向量,圖片也沒有被重新編碼。消失的只有加密,以及跟著加密一起來的那些權限旗標。
這份文件有數位簽章,簽章會怎樣?
它會驗不過,而且本來就該這樣。簽章保證的是某一段精確的位元組序列;拿掉加密必然產生另一段序列,所以蓋在舊位元組上的簽章不再吻合。如果簽章正是這份文件重要的地方,請留著已簽章的原檔,把解鎖後的複本拿來閱讀與編輯就好。
把 PDF 的密碼拿掉,這件事我可以做嗎?
這一頁設想的情況是:文件是你的、或者是連同密碼一起寄給你的、又或者它本來就對所有人都打得開而只是限制列印。某一份特定文件可不可以被修改,是關於那份文件與它所附條款的問題,不是關於工具的問題,而且值得在動手之前而不是之後把它想清楚。
銀行寄來的電子帳單,密碼是身分證字號後幾碼那種,可以在這裡拿掉嗎?
可以,而且那正是這一頁最常被用到的場景。做法是把通知信上寫的那組密碼填進密碼欄,拿回一份不用密碼就打得開的複本,方便你存檔或交給記帳軟體。要提醒的是:密碼規則對同一家機構寄給你的每一份文件通常都相同,所以那組字串本身要當成個人資料看待,不要連同帳單一起交給任何一個你不知道機房在哪裡的網站。


