目に見えない壊れやすい電子透かしを埋め込みたいPDFファイルがあります。このタスクに使用できる適切なアルゴリズムは何ですか?
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オブジェクトが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
。