1

ハッシュを保存されたドキュメントと比較するために、署名された PDF の元のドキュメントを取得しようとしています。

ドキュメントに複数の署名がある場合、これは非常に簡単です。acrobat リーダーを使用すると、ドキュメントの以前のリビジョンに移動して保存することができます。

驚くべきことに、これは、元のデータを取得するための簡単な方法がない最初の署名では機能しません。

リーダーでそれを行うことはできないため、iTextSharp を使用してプログラムで試しました。しかし、私は深くグーグルで調べましたが、それを行う方法が見つかりませんでした. 私が見つけた関連する投稿はこれだけですが、解決策は提供されていません。

誰かがこの問題に直面し、解決策を見つけましたか?

前もって感謝します。

編集: mkl の応答に基づいてデータを抽出するコードをここに置きます。応答のコメントを読んで、署名されていない PDF の長さが固定されていないことに注意してください。

String sOriginalText = File.ReadAllText("FileSigned.pdf", Encoding.Default);
int sTrailerNumberPosition = sOriginalText.LastIndexOf("]/Prev ") + "]/Prev ".Length;
int sTrailerNumberEndPosition = sOriginalText.IndexOf(">", sTrailerNumberPosition);
String sTrailerIndex = sOriginalText.Substring(sTrailerNumberPosition, sTrailerNumberEndPosition -sTrailerNumberPosition);
int iTrailerIndexPosition = sOriginalText.IndexOf(sTrailerIndex + "\r\n%%EOF");
int iEndPosition = sOriginalText.IndexOf("%%EOF", iTrailerIndexPosition) + "%%EOF".Length;
String sOutText = sOriginalText.Substring(0, iEndPosition);
File.WriteAllText("c:/OriginalFile.pdf", sOutText, Encoding.Default);
4

1 に答える 1

4

署名された PDF の元のドキュメントを取得するタスクが実現可能かどうかは、署名が最初にどのように適用されたかによって異なります。

  1. 署名が追加モードで適用された場合 (つまり、増分更新としての PDF 仕様ISO 32000-1:2008の言語に従って、セクション 7.5.6 を参照)、この追加された増分更新リビジョンを切り取るだけで済みます。

    おそらく署名後に検査するドキュメントになる保存されたドキュメントがあるため、保存されたファイルの長さで署名されたファイルを単純に切り取り、ハッシュなどを使用して比較できます。これは、署名された文書が元の文書から派生したものであることを示すのに十分です。ただし、複数の増分更新を切り捨てた可能性があるため、他の中間リビジョンがあった可能性があります。

    一般に、署名済み PDF の/Prevトレーラ エントリをたどって前のリビジョンの相互参照テーブルに移動することで、前のリビジョンを見つけることができます。そこからドキュメントの終了マーカー%%EOFに移動します。

    追加された予告編には、変更されているかどうかにかかわらず、前の予告編からの前のエントリ (存在する場合) を除くすべてのエントリが含まれます。さらに、追加されたトレーラ ディクショナリには、前の相互参照セクションの場所を示す Prev エントリが含まれます (表 15 を参照)。各トレーラーは、独自のファイルの終わり (%%EOF) マーカーで終了する必要があります。

    相互参照テーブルの代わりに相互参照ストリームを使用する PDF の場合、相互参照ストリーム ディクショナリに類似のエントリがあります。

    (ファイルに複数の相互参照ストリームがある場合にのみ存在します。ハイブリッド参照ファイルでは意味がありません。7.5.8.4「圧縮参照ストリームをサポートしないアプリケーションとの互換性」を参照してください)ファイルの先頭から前の相互参照ストリームの先頭まで。このエントリは、トレーラ ディクショナリの Prev エントリと同じ機能を持っています (表 15)。

    ただし、追加された増分更新リビジョンには、署名に加えて他の変更が含まれている可能性があることに注意してください。したがって、以前のリビジョンが保存された文書と一致していたとしても、署名された文書が保存された文書に基づいていることしかわかりません。

  2. 署名が追加モードで適用されていない場合は、運が悪い: PDF を操作するプログラム (署名など) は、ドキュメントのバイナリ コンテンツを完全に再配置する可能性があり、オブジェクトの番号を付け直したり、圧縮を変更したり、未使用のオブジェクトを削除したりすることさえあります。ドキュメントの外観は変わりません。

于 2013-04-09T12:29:32.170 に答える