記事一覧へ戻る
操作ハウツー

パスワード付き PDF のロックを解除する方法 (自分が知っているパスワード前提)

正規のパスワードを知っている PDF を、ブラウザ内だけで保護なし PDF に書き出す手順。所有者パスワードと利用者パスワードの違い、解除しない方が良いケースも触れます。

自分で設定したパスワードを忘れる前に

最初に重要な前提を置きます。このツールは 正規のパスワードを知っている (もしくはオーナー権限の制限のみで開封パスは無い) PDF を解除する ためのものです。知らないパスワードを総当たり攻撃で突破するための道具ではありません。受信した契約書や守秘契約 (NDA) の対象資料など、相手が保護を意図して送ってきた PDF を解除する用途は想定していません。

そのうえで、実務でパスワード解除が必要になる場面は意外と多くあります。自分が数年前に設定したパスワードを忘れてしまい、原本にアクセスできなくなった。配布先で「開けない」「業務システムにアップロードできない」という苦情が頻発するため、社内配布用に解除版を別に作る。スキャナの一括設定で全 PDF に Owner password (印刷 / 編集 / コピー禁止) が掛かってしまい、解除版を作らないと OCR ツールや経費精算システムに読み込ませられない。こうしたケースは pdf-unlock のターゲットそのものです。

ブラウザだけで保護を外す手順

pdf-unlock を開いて PDF をドラッグ & ドロップします。読み込み時にツールが暗号化方式を確認し、入力欄にパスワードを入れて「解除」を押すと解除済み PDF が生成されます。Owner password だけが掛かっていて User password (開封パス) が無いタイプの PDF — つまり開くだけならパスワード不要だが、印刷・編集・コピーが禁止されているもの — はパスワード欄を空欄のままで解除できます。これは qpdf が「Owner password が空でも復号できる」仕様だからで、署名や DRM とは別の話です。

User password が設定された PDF (開く時点でパスワードを聞かれるタイプ) は、正しいパスワードを入れる必要があります。誤ったパスワードを入れた場合は「invalid password」エラーが返り、PDF 本体には変更が加わりません。解除後はテキスト、フォント、画像、ページレイアウト、しおりがすべて保持された状態で、暗号化フラグだけが外れた PDF がダウンロードできます。サイズはほぼ同じか、暗号化オーバーヘッドが取れる分わずかに減ります。

複数の PDF を同時に投入することもでき、それぞれの解除結果は個別ダウンロードまたは ZIP 一括取得が選べます。終わったらブラウザのリロードで状態がリセットされ、入力ファイルもパスワードもメモリ上から消えます。

qpdf-wasm の内部で起きていること

ブラウザ内 PDF 解除のエンジンは qpdf を WebAssembly にビルドした版 です。qpdf は PDF の構造変換 (linearize / decrypt / repair) を担う長年実績のあるネイティブ C++ ツールで、これを Emscripten で wasm 化した /public/qpdf/qpdf.js + qpdf.wasm をブラウザに読み込んで、Emscripten の仮想ファイルシステム (qpdf.FS) 経由でファイルを書き込み、qpdf.callMain([...args])--decrypt コマンドを走らせます。引数は ["--password=...", "--decrypt", "in.pdf", "out.pdf"] のかたちで、復号後の PDF を FS.readFile で取り出してダウンロード用 Blob にまとめます。

PDF の暗号化は AES-128 / AES-256 / RC4 のいずれかで、PDF 1.7 以降は AES-256 が標準です。User password を直接使うのではなく、パスワードと PDF 内のソルトから派生鍵を作る方式で、qpdf はこの派生・復号・再構築までを 1 コマンドで実行します。Owner password だけが掛かっているケースで空パスワードが通るのは PDF 仕様 (ISO 32000) の挙動で、Owner password は「制限を解除する権限」を持つだけで、復号鍵そのものは暗号化辞書から導出できるためです。解除前に pdf-lib で暗号化フラグの有無を事前検査して、未保護の PDF を入れた場合は早期に弾く構成にしてあります。

なぜブラウザ内処理を選ぶか

「PDF パスワード解除」と検索すると、ファイルとパスワードをサーバーにアップロードして解除版を返す Web サービスが多数並びます。ここに パスワードと暗号化された PDF をセットで渡す という構造は、データ流出経路として極めて性質が悪いものです。サービス側のログにパスワードが残った場合、それは「同じパスワードを使い回している他のファイル」の鍵にもなり得ます。暗号化された PDF 単体ならまだ攻撃者の手間が掛かりますが、平文パスワードとセットでは攻撃側のコストは 0 になります。

ブラウザ内処理のときは、パスワードも PDF も Tab のメモリより外には出ません。pdf-unlock の WebAssembly ランタイムは初回に /qpdf/qpdf.jsqpdf.wasm を取得するだけで、ファイル内容を返送する通信は存在しません。ソースは GitHub で公開しており、qpdf.callMain を呼んでいる箇所と、その入出力が qpdf.FS (Emscripten 仮想 FS) で完結していることをコードで確認できます。「パスワード解除作業のログを誰の手にも残さない」を選べる仕組みは、機微度の高い PDF を扱う限り意味があります。Owner password の解除であっても、配布先や経歴に紐づくファイルなら、ブラウザ内で済ませるコストはとくに低くおすすめです。