web-dev-qa-db-ja.com

PDF埋め込みに適した壊れやすい電子透かしアルゴリズム

目に見えない壊れやすい電子透かしを埋め込みたいPDFファイルがあります。このタスクに使用できる適切なアルゴリズムは何ですか?

1
user27889

PDF読者の大多数は、%EOFトークンを押すと、PDFデータストリームの読み取りを停止し、とにかく%で始まるコメントを無視します。

したがって、HMAC-SHA1を計算し、結果のハッシュをPDFファイルに追加することは完全に実行可能です。

これは厳密に言えば、透かし-ではありませんが、要求に応じて見えず壊れやすいものです。

結果のPDFファイルは次のようになります

...
startxref
179091
%%EOF
%0xde7c9b85b8b78aa6bc8a7a36f70a90701c9db4d9

そこから整合性を簡単に計算できます。

pdftkツールを使用すると、PDFを解凍し、Adobeメタデータストリーム(存在する場合)を操作し、その中にXML HMAC(またはコメント)を埋め込むこともできます。

3 0 obj
<<
/Subtype /XML
/Length 1381
/Type /Metadata
>>
stream
<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
<?adobe-xap-filters esc="CRLF"?>
<x:xmpmeta xmlns:x='Adobe:ns:meta/' x:xmptk='XMP toolkit 2.9.1-13, framework 1.6'>
...
</x:xmpmeta>
<!-- 0xf7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8 -->
<?xpacket end='w'?>

endstream
endobj

ストリームの長さが変更されます。 XMPオブジェクトに十分なたるみがある場合は、これを回避できますが、圧縮モードのpdftkはそれを再計算して、有効なPDFを出力できるため、必要ありません。

この後者の場合、HMAC情報は圧縮され、直接読み取ることはできません。 PDFを解凍して、そのMACを再計算するには、pdftk(またはiTextライブラリなど)が必要です。

手順は次のとおりです。

  • PDFをストリームに解凍し、ストリームに添付します
  • ストリームを一度に1行ずつ読み取り、それを使用してHMACを構築します
  • 行がHMAC形式で見つかった場合、HMAC計算では無視し、そのHMAC値をSavedHMACに格納します。
  • eOFで、HMACをチェックする場合は、HMACとSavedHMACを比較するだけです。
  • hMACを埋め込む場合は、解凍を繰り返します。今回はHMAC行を適切に埋め込み、PDFを再圧縮します。これはすべて、ディスクに何も書き込まずに実行できます。

PDFオブジェクトがPDFストリームに埋め込まれている場合、たとえばiTextライブラリを使用して、同じことを行うことができますが、これを行うのははるかに複雑になりますfragile。PDFオブジェクトは互いにほとんど独立しているため、今回はオブジェクトレベルで、HMACに似たものに再度頼る必要があります。次に、値を100%透明なテキスト、またはページ境界の外側のテキストとして埋め込みます(一方または両方の手法を採用しているeBookパブリッシャーを知っています)。

ITextでも同様ですが、これらは壊れにくいであり、ページ上のテキストオブジェクトの間隔を調整するアルゴリズムです。ほとんどのテキストオブジェクトは、ページ単位の整数倍に揃えられていません。

24.4801 0 Td
[(w)4001.47(atermarking)]TJ
59.7 0 Td
(algorithms)Tj
46.9801 0 Td

肉眼で見える最小ステップを簡単に決定できます。 0.005。次に、1をエンコードする場合は、すべてのテキスト位置を、表示される順序で、ステップの最も近い奇数倍数に丸めます。または最も近い0をエンコードする場合は、ステップの倍数

このような透かしはコピー後も存続し、各ページに個別に表示されます。適切なエラー回復(ターボコード、リードソロモン...)を追加すると、ページ上のいくつかの(もちろん多すぎない...)オブジェクトの削除または追加にも耐えることができます。また、印刷に耐え、印刷されたページのスキャンから回復できる可能性もあります。

これを行うには、iText RenderListenerを実装します。そのrenderTextメソッドはテキストボックスのOriginをキャプチャし、適切な PdfCopy

2
LSerni