Ho un file PDF che voglio incorporare una filigrana digitale invisibile e fragile. Quali sono gli algoritmi adatti disponibili per questa attività?
La maggior parte dei lettori PDF smetterà di leggere il flusso di dati PDF dopo aver colpito il token %EOF
, e comunque ignorerà i commenti a partire da %
.
Quindi, sarebbe perfettamente fattibile calcolare HMAC-SHA1 e aggiungere l'hash risultante al file PDF.
Questo non è, in senso stretto, una filigrana - ma è invisibile e fragile, come richiesto.
Il tuo file PDF risultante terminerebbe in qualcosa di simile a
...
startxref
179091
%%EOF
%0xde7c9b85b8b78aa6bc8a7a36f70a90701c9db4d9
da cui è possibile calcolare l'integrità in modo semplice.
Con l'aiuto dello strumento pdftk
, puoi anche essere in grado di decomprimere un PDF, manipolare il suo stream Adobe Metadata (se ce n'è uno) e incorporare al suo interno un HMAC XML - o anche un commento:
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
La lunghezza del flusso verrà modificata; se c'è abbastanza spazio nell'oggetto XMP, è possibile aggirarlo, ma non è necessario, poiché pdftk
in modalità compressa sarà in grado di ricalcolarlo e di generare un PDF valido.
In quest'ultimo caso, le informazioni HMAC saranno compresse e non direttamente leggibili. Avrai bisogno di pdftk
(o della libreria iText, o ...) per decomprimere il PDF e ricalcolare il suo MAC.
La procedura sarebbe la seguente:
Puoi fare lo stesso con un oggetto PDF incorporato nello stream PDF, ad es. usando la libreria iText, ma questo sarebbe molto più complicato da rendere fragile . Gli oggetti PDF sono in gran parte indipendenti l'uno dall'altro, quindi è necessario ricorrere di nuovo a qualcosa di simile a HMAC, questa volta a livello di oggetto, e quindi incorporare il valore come ad es. Testo trasparente al 100% o testo al di fuori dei limiti della pagina (conosco gli editori di e-book che impiegano una o entrambe le tecniche).
Anche con iText, ma questi non sono fragili , sono algoritmi che modulano la spaziatura degli oggetti di testo sulla pagina. La maggior parte degli oggetti di testo non è allineata a un multiplo intero dell'unità di pagina:
24.4801 0 Td
[(w)4001.47(atermarking)]TJ
59.7 0 Td
(algorithms)Tj
46.9801 0 Td
e puoi facilmente determinare il passo minimo che sarà visibile ad occhio nudo, ad es. 0.005. Quindi, basta semplicemente arrotondare tutte le posizioni di testo, nell'ordine in cui appaiono, al multiplo dispari più vicino del passo, se vuoi codificare un 1. O al più vicino anche multiplo del passo, se vuoi codificare uno 0.
Tale filigrana sopravviverà alla copia e sarà presente indipendentemente su ciascuna pagina; con l'aggiunta di un adeguato recupero degli errori (codice turbo, Reed-Solomon ...), sopravviverà anche alla rimozione o aggiunta di alcuni (non troppi, ovviamente ...) oggetti sulla pagina. È anche possibile che sopravviva alla stampa e che sia recuperabile da una scansione di una pagina stampata.
Dovresti farlo implementando un iText RenderListener
, il cui metodo renderText
catturerebbe l'origine della textbox e la "modulerebbe" come richiesto prima di essere inviata all'appropriato PdfCopy
.
Leggi altre domande sui tag cryptography steganography