Fragili algoritmi di filigrana digitale adatti per l'incorporamento di PDF

1

Ho un file PDF che voglio incorporare una filigrana digitale invisibile e fragile. Quali sono gli algoritmi adatti disponibili per questa attività?

    
posta user27889 06.07.2013 - 12:07
fonte

1 risposta

2

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:

  • decomprimere il PDF in un flusso e collegarlo allo stream
  • legge lo stream una lunga riga alla volta e usalo per costruire l'HMAC
  • se una riga viene trovata in formato HMAC, ignorala per il calcolo HMAC e memorizza il suo valore HMAC in SavedHMAC
  • su EOF, se si controlla l'HMAC è sufficiente confrontare HMAC e SavedHMAC
  • se si incorpora l'HMAC, ripetere il uncompress, questa volta incorporando la riga HMAC in modo appropriato, quindi ricomprimere il PDF. Tutto ciò può essere fatto senza scrivere nulla sul disco.

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 .

    
risposta data 07.07.2013 - 10:40
fonte

Leggi altre domande sui tag