Schema di watermarking robusto per un bitstream jpeg cifrato
1. Schema di Watermarking Robusto per
un Bitstream JPEG Cifrato
GRUPPO 2
Università degli Studi di Salerno
Dipartimento di Informatica
Corso di laurea Magistrale in Informatica
Relazione per il progetto del corso di Compressione Dati
3. TAVOLA DEI CONTENUTI
INTRODUZIONE
1
PROGETTAZIONE
ED
IMPLEMENTAZIONE
2
● Organizzazione del progetto
● Approccio iniziale
● Algoritmi di permutazione/
depermutazione
● Algoritmi di cifratura/
decifratura
● Algoritmo di watermarking
ESPERIMENTI
ED
ANALISI DEI
RISULTATI
3 4
CONCLUSIONI
E
SVILUPPI
FUTURI
● Testing
5. INTRODUZIONE
JPEG (acronimo di Joint Photographic Expert Group) è uno degli
standard più utilizzati e conosciuti
per la compressione di immagini molto popolare su internet.
Per garantire simultaneamente la protezione del contenuto dell’immagine
e del copyright, viene fornito uno schema di watermarking robusto per un
bitstream JPEG crittografato mediante lo shuffling dei pixel.
12. APPROCCIO INIZIALE
● Scelta della libreria per l’implementazione
dell’algoritmo JPEG
https://github.com/ghallak/jpeg-python
13. APPROCCIO INIZIALE
● Attenta analisi del processo di cifratura del bitstream
● Primo tentativo cifrare/decifrare bitstream in seguito
alle fasi di compressione/decompressione
● Limitazioni di python nel cifrare bitstream
● Utilizzo di java per la creazione di un tool esterno
14. APPROCCIO INIZIALE
● Tool creato mediante l’utilizzo della libreria bouncy castle
● Semplice interfaccia grafica
● Approccio che presentava
diverse problematiche:
○ Impossibilità nel
cifrare/elaborare
determinati elementi (AC)
○ Introduzione di carico
computazionale eccessivo
16. ALGORITMO DI PERMUTAZIONE
● Per motivi di implementazione e di gestione delle
operazioni successive di shuffling, cifratura e
watermarking, è stata effettuata una trasformazione
di tipo raster dei blocchi MCU (16 × 16 pixel) da
permutare.
● L’immagine viene rappresentata mediante un array
tridimensionale.
17. ALGORITMO DI PERMUTAZIONE
● L’immagine (rappresentata mediante un array tridimensionale di pixel) è
stata per prima cosa suddivisa in blocchi di dimensione 16 × 16 pixel,
● Sono stati presi tutti questi blocchi “quadrati” (chiamati blocchi MCU,
aventi, quindi, 16 × 16 = 256 pixel) e ciascuno di essi è stato trasformato in
un blocco “rettangolare” di dimensione 1 × 256 pixel ed inserito in un array
apposito. In questo modo la tabella risultante avrà un numero di righe pari
al numero di blocchi MCU dell’immagine ed un numero di colonne pari a
256.
● Sono stati presi gli indici (numeri) delle righe, le quali corrispondono ad un
singolo blocco MCU 1 × 256 pixel ed inseriti in un array.
● I numeri all’interno dell’array sono permutati secondo una funzione
random.sample() con seed: il seed è generato a partire da un valore chiave
(key) e può essere rigenerato a partire dallo stesso valore chiave in altre
istanze.
● Infine, sono stati ricostruiti i blocchi “quadrati” di dimensione 16 × 16 pixel a
partire dai blocchi “rettangolari” 1 × 256 pixel e cioè dalle righe dalla tabella
creata in precedenza, secondo l’ordine definito dall’array di indici/numeri
permutati. E’ stata così ottenuta l’immagine visibile con i blocchi permutati.
19. ALGORITMO DI DEPERMUTAZIONE
● L’immagine permutata viene suddivisa in blocchi MCU di dimensione 16 ×
16 pixel.
● Gli n blocchi MCU “quadrati” vengono trasformati ciascuno in blocchi
“rettangolari” di dimensione 1 × 256 pixel ed inseriti in una apposita tabella,
che avrà una dimensione n × 256.
● Viene ricreato l’array dei numeri degli indici dei blocchi permutati,
riottenendo lo stesso array avuto in fase di permutazione, allo stesso
identico modo tramite la funzione random.sample() con seed.
● Infine, sono stati ricostruiti i blocchi “quadrati” di dimensione 16 × 16 pixel a
partire dai blocchi “rettangolari” 1 × 256 pixel e cioè dalle righe dall’array
creato in precedenza, andando, però, a prelevarli man mano secondo
l’ordine crescente degli indici/numeri all’interno dell’array. E’ stata così
ottenuta l’immagine originale avente i blocchi rimessi nel loro ordine
originale.
22. LIBRERIE PER LA CIFRATURA
Utilizzo della libreria imageshuffle
Utilizza un algoritmo di cifratura basato sulla
permutazione dei pixel
https://github.com/mastnk/imageshuffle
23. ALGORITMO DI CIFRATURA
Prende in input un immagine RGB ad 8 bit per
canale R,G,B e la divide in blocchi 8 × 8
Le componenti R,G,B sono divise in due
sotto-componenti ciascuna:
in base ai 4 bit superiori e 4 bit inferiori
24. ALGORITMO DI CIFRATURA
In questo modo otteniamo 6 canali da 4 bit:
● R 4-bit-superiori (RS)
● R 4-bit-inferiori (RI)
● G 4-bit-superiori (GS)
● G 4-bit-inferiori (GI)
● B 4-bit-superiori (BS)
● B 4-bit-inferiori (BI)
25. ALGORITMO DI CIFRATURA
Vengono invertite le intensità di pixel, in posizioni
casuali di ogni blocco 8 × 8
(RS, RI, GS, GI, BS, BI)
Infine vi è una permutazione casuale di tutti i pixel
dell’immagine
Questi 2 passi dipendono dalla chiave simmetrica
26. ALGORITMO DI CIFRATURA
La decifratura è lo stesso processo effettuato a
ritroso:
● Viene presa l’immagine cifrata
● I pixel vengono permutati nelle posizioni originali
● Le intensità dei pixel vengono ripristinate
● Si ottiene in output l’immagine decifrata
27. ALGORITMO DI CIFRATURA
Il processo di cifratura implementa l’algoritmo di
imageshuffle e diversi passi utili per facilitare le
operazioni inerenti al processo di watermarking
Vogliamo utilizzare i DC dell’immagine per le
operazioni di watermarking!
28. ALGORITMO DI CIFRATURA
Il processo di cifratura prende in input 2 elementi:
● L’immagine da cifrare
● La chiave di cifratura per imageshuffle
29. ALGORITMO DI CIFRATURA
Per ottenere tutti i DC sulla prima colonna,
l’immagine in input viene divisa in blocchi 8 × 8 ed
ogni blocco viene trasformato in una riga 1 × 64
30. ALGORITMO DI CIFRATURA
Si crea un’immagine cifrata, utilizzando l’algoritmo
di cifratura di imageshuffle
31. ALGORITMO DI CIFRATURA
Viene scambiata la prima colonna dell’immagine in
chiaro (a righe 1 × 64) con quella dell’immagine
cifrata (a righe 1 × 64):
In questo modo manteniamo i DC in chiaro
sull’immagine cifrata per applicare il watermark!
33. ALGORITMO DI CIFRATURA
Infine, l’immagine (a righe) cifrata e con i DC non
cifrati viene ricostruita in blocchi 8 × 8 e la funzione
ritorna 2 elementi:
● L’immagine cifrata (con i DC non cifrati)
● La colonna dei DC cifrati: ci servirà per
decifrare correttamente l’immagine!
36. ALGORITMO DI DECIFRATURA
Il processo di decifratura prende in input 3 elementi:
● L’immagine da decifrare
● La chiave di cifratura per imageshuffle
● La colonna dei DC cifrati, data in output dal
processo di cifratura
37. ALGORITMO DI DECIFRATURA
L’immagine cifrata viene convertita da blocchi 8 × 8
in righe 1 × 64
Una volta avvenuta la conversione, viene sostituita
la prima colonna dei DC in chiaro con quella dei
DC cifrati:
così si riottiene l’immagine a righe 1 × 64 cifrata!
38. ALGORITMO DI DECIFRATURA
Una volta ottenuta l’immagine a righe cifrata
originale, si esegue l’algoritmo di imageshuffle
sull’immagine ed otteniamo l’immagine non cifrata
39. ALGORITMO DI DECIFRATURA
Infine, l’immagine viene riordinata dalle righe 1 × 64
in blocchi 8 × 8, ottenendo l’immagine in chiaro e
permutata
42. ALGORITMO DI WATERMARKING
L’immagine viene convertita da RGB nelle componenti
YCrCb, quindi avremo:
● 1 componente di luminanza
● 2 componenti di crominanza
43. ALGORITMO DI WATERMARKING
● L’algoritmo di compressione JPEG divide l’immagine
in tanti blocchi DCT 8 × 8:
○ 1 coefficiente DC con coordinate (0,0)
○ 63 coefficienti AC.
● Il nostro algoritmo è interessato solamente alle
componenti DC. Quindi nella funzione di
compressione vengono prese tali componenti per
ogni blocco 8 × 8 e vengono salvate per poi passarle
alla funzione di watermark.
44. ALGORITMO DI WATERMARKING
● Nella funzione di watermark vengono eseguite tali
operazioni:
1. Vengono raggruppati tutti i coefficienti Dc quantizzati secondo
la loro divisione MCU. Ogni blocco MCU contiene 4 coefficienti
DC quantizzati dei blocchi DCT adiacenti (indicati con indici i =
0,1,2,3).
2. Viene calcolato il max e il min dei 4 valori DC e il valore medio.
45. ALGORITMO DI WATERMARKING
3. Vengono scelti due interi T1 < T2 per calcolare la grandezza della
modifica come:
4. Viene incorporato un bit di informazione di watermarking w
modificando il coefficiente DC quantizzato.
Quando w = 1 viene modificato il DC0
come segue:
Quando w = 0 viene modificato il
DC0 come segue:
Se la differenza in valore assoluto tra DC0 e il nuovo DC’0 è più grande di 3 il
coefficiente DC non deve essere modificato, altrimenti DC0 va rimpiazzato con
DC’0
46. ESTRAZIONE DELWATERMARKING
● Nel decompressore si vuole estrarre i bit di watermark inseriti su un
bitstream JPEG cifrato, in quanto su quello non cifrato non siamo in
grado di farlo visto che nel compressore questi bit vengono aggiunti
in una fase di permutazione.
● Il bit estratto può essere ottenuto come:
47. ALGORITMO DI VERIFICA DEL
WATERMARKING
● Questo algoritmo è utile se si vuole verificare se la nostra foto con
watermark ha subito degli attacchi.
● Esso prende in input una foto
● Salva i DC per poi estrarre il watermark.
● Si potrà verificare se i bit di watermark estratti coincidono con la
foto originale, se la risposta è affermativa significa che la foto non è
stata attaccata, in caso di risposta negativa si potrà verificare quanti
bit di watermark sono stati modificati.
51. ESPERIMENTI ED ANALISI
DEI RISULTATI
Edit configurations:
L’immagine fornita in input multipla di 8 o 16.
starter_encoder.py
starter_decoder.py
watermark_array.txt
52. ESPERIMENTI ED ANALISI
DEI RISULTATI
Sperimentazione - Encoder:
Immagine Input Immagine Permutata Immagine cifrata
Image_input.png Image_permutation.png Image_AC_encrypt.png
53. ESPERIMENTI ED ANALISI
DEI RISULTATI
Sperimentazione - Encoder:
Immagine compressa con watermark
Image_compressed.png
L’ output della compressione in formato testuale necessita una
conversione in file binario per ottenere la reale size della compressione:
Image_compressed.txt
54. ESPERIMENTI ED ANALISI
DEI RISULTATI
Sperimentazione - Encoder:
La taglia dei file
Image_compressed.png Image_compressed.txt
Image_input.png
463 KB
Image_compressed.bin
575 KB
4599 KB
55. ESPERIMENTI ED ANALISI
DEI RISULTATI
Sperimentazione - Decoder:
Immagine compressa
con watermark
Immagine decompressa
e cifrata
Immagine decompressa
e decifrata
Image_compressed.png Image_decompressed.png Image_decrypted.png
56. ESPERIMENTI ED ANALISI
DEI RISULTATI
Sperimentazione - Decoder:
Immagine decompressa, decifrata e depermutata
Watermark estratto.
Image_output.png
62. CONCLUSIONI E SVILUPPI FUTURI
● Il progetto ha raggiunti gli obiettivi prefissati.
● Tool modulare e con ampia gestione dei parametri.
● Taglia delle immagini che influisce su diversi aspetti.
63. CONCLUSIONI E SVILUPPI FUTURI
● Diversi sviluppi futuri:
○ Gestione della size delle immagini mediante
meccanismo di padding.
○ Output compressore mediante file binari
piuttosto che testuali.
○ Maggior numero di test.
○ Test della robustezza in seguito ad attacchi tipici.