Table of Contents

Tema 2 - Hiding secrets

Obiectiv

Tema are ca scop exersarea noțiunilor Verilog folosite pentru implementarea circuitelor secvențiale complexe, prin:

Descriere și cerințe

Implementați în Verilog un circuit secvențial sincron care ascunde un mesaj secret într-o imagine. Imaginile inițiale sunt reprezentate în spațiul de culoare RGB și au dimensiunea de 64×64 de elemente (pixeli), în care fiecare element are 24 de biți (8 biți 'R', 8 biți 'G' și 8 biți 'B'). Mesajul este de tip text, cu caractere ce aparțin setului extASCII (8 biți necesari pentru fiecare caracter). Pentru a putea cripta mesajul în imagine, va fi necesară efectuarea următoarelor etape de prelucrare:

1. Conversia imaginii din RGB în grayscale

Detalierea metodei de transformare grayscale

Detalierea metodei de transformare grayscale

Imaginea inițială este codată în spațiul RGB, cu valori pe toate cele trei canale. Imaginea rezultată va fi stocată pe 8 biți în canalul 'G'. Valoarea din canalul 'G' va fi calculată drept media dintre maximul și minimul valorilor din cele trei canale. După această operație, canalele 'R' și 'B' vor fi setate pe valoarea '0'. Fiecare pixel se prelucrează individual.

2. Compresia imaginii folosind metoda AMBTC

Detalierea metodei de compresie AMBTC

Detalierea metodei de compresie AMBTC

Algoritmul AMBTC are la bază împărțirea unei imagini grayscale în sub-blocuri de dimensiune M suficient de mici (în cazul nostru $4$ x $4$) și modificarea fiecăruia pe două nivele, $L_m$ și $H_m$. Pentru fiecare bloc al imaginii se execută următorii pași:

  1. Se calculează media aritmetică $AVG$ $$ AVG = \frac{\sum_{i=1}^{M \cdot M}\mu_i}{M\cdot M} $$
  2. Se calculează deviația standard $var$ $$ var = \frac{\sum_{i=1}^{M\cdot M}|\mu_i-AVG|}{M\cdot M} $$
  3. Se construiește o hartă (bitmap 4×4) aux după următoarele două reguli:
    • dacă valoarea pixelului $μ_i < AVG$ atunci $0$
    • altfel $1$
  4. Se calculează valorile $L_m$ și $H_m$ folosind următoarele formule: $$ L_m = AVG - \frac{M\cdot M\cdot var}{2(M\cdot M-\beta)} $$ $$ H_m = AVG + \frac{M\cdot M\cdot var}{2\beta)}, $$ unde $\beta$ reprezintă numărul biților de $1$ din hartă.
  5. După obținerea acestor două valori, blocul se va reconstrui, amplasând pe pozițiile marcate cu $0$ valoarea $L_m$, iar pe pozițiile marcate cu $1$ valoarea $H_m$

Metoda este descrisă pe larg în capitolul 2.1 al articolului din Resurse.

3. Încapsularea mesajului în imaginea prelucrată

Detalierea metodei de integrare a mesajului

Detalierea metodei de integrare a mesajului

Mesajul ce trebuie secretizat este constituit dintr-un șir de caractere ASCII. Fiecare caracter este codat pe 8 biți. Astfel, în fiecare bloc putem încapsula doar 2 caractere. Inițial șirul de biți se va transforma din baza 2 în baza 3. Fiecare valoare $S_j$ va fi integrată în pixelii blocului, exceptând prima valoare $L_m$ și $H_m$. Procedura va fi executată după următorul algoritm:

  pentru fiecare pixel compresat p[j] din blocul b[i]
    dacă p[j] poate primi un bit secret 
      dacă bitul secret s[b] este 0, atunci
        nu se execută nicio operație
      dacă bitul secret s[b] este 1, atunci
        p[j] = p[j] + 1;
      dacă bitul secret s[b] este 2, atunci
        p[j] = p[j] - 1;

În Anexă este descris procesul complet de prelucrare a unui bloc de $4$x$4$ pixeli, împreună cu detalii relevante pentru implementarea în Verilog.

După fiecare etapă, imaginea va fi suprascrisă cu rezultatul prelucrării pasului respectiv. Cele 3 cerințe de mai sus trebuie să se comporte ca un proces continuu pe aceeași imagine. Astfel, task-ul 2 va începe automat după task-ul 1, iar task-ul 3 va începe automat după task-ul 2. Este necesar ca task-urile să fie executate în ordine.

Implementare

Pentru implementare este necesară construirea unui automat cu stări finite care să modeleze cele 3 cerințe. Acest automat va comunica cu module adiționale, image și base2_to_base3. Descrierea detaliată a fiecărui modul se regăsește mai jos.

top

Modul deja implementat, el instanțiază modulul responsabil cu prelucrarea imaginii (process), cel ce emulează imaginea încărcată în memorie (image) și încarcă șirul ce urmează a fi codat. Totodată, acesta este responsabil pentru realizarea conexiunilor între cele două module.

image

Modul deja implementat, responsabil cu încărcarea imaginii din fisier în memoria internă, acesta reprezintă interfața între fsm-ul implementat în process și imagine. Folosind semnalele de control, modulul process poate citi sau scrie elemente individuale (pixeli).

Modulul respectă următoarea interfață:

module image (
        input                    clk,			       
        input [image_size - 1:0] row,	
	input [image_size - 1:0] col,		
	input                    we,			               
	input [23:0]             in,		                
	output[23:0]             out                    

Descrierea semnalelor folosite de acest modul este următoarea:

Funcționalitatea modulului este următoarea:

Urmăriți conexiunile din top pentru a vedea corespondența cu modulul process

process

Automatul cu stări finite care va modela comportamentul trebuie implementat în modulul process. Aici se vor efectua toate transformările necesare și se va instanția base2_to_base3, util în secvența de transformare a caracterelor în ultima etapă.

Modulul trebuie să respecte următoarea interfață:

module process (
        input              clk,		
        input  [23:0]      in_pix,	            
        input  [8*512-1:0] hiding_string,
        output [5:0]       row, col, 	
        output             out_we, 			           
        output [23:0]      out_pix,	            
        output             gray_done,		           
        output             compress_done,	
        output             encode_done

Descrierea semnalelor folosite de acest modul este următoarea:

Modulul process va interacționa cu modulul image pentru operațiile de citire și scriere a imaginii și cu modulul base2_to_base3 pentru transformarea caracterelor într-un șir compatibil operației de codare. Ambele module sunt deja implementate în scheletul temei.

Modificarea declarării ieșirilor în output reg este permisă exclusiv pentru acest modul.

base2_to_base3

Modul deja implementat, responsabil cu executarea algoritmului de transformare din baza 2 în baza 3.

Modulul are următoarea interfață:

module base2_to_base3 (
    output   [31 : 0]  base3_no, 
    output             done,
    input    [15 : 0]  base2_no,
    input              en,
    input              clk);

Descrierea semnalelor folosite de acest modul este următoarea:

Pentru a-l putea folosi, intrarea base2_no va fi setată și pe același ciclu de ceas semnalul en va fi asertat. Ulterior, într-o altă stare, se va aștepta semnalul done, care va indica faptul că output-ul este valid și poate fi citit. Pentru o descriere detaliată, revedeți Tema 1.

Pentru transformarea numerelor în baza 3 este necesară folosirea modului dat.

Observații

Precizări

Notare

Punctajul inițial al checker-ului nu reprezintă punctajul final al temei. Acesta va fi acordat de către asistent, în urma analizei individuale a fiecărei implementări.

Dacă tema primește 0 puncte pe platforma vmchecker, se pot acorda maxim 2 pct pentru ideea de implementare, la latitudinea asistentului. Ideea și motivele pentru care nu funcționează trebuie documentate temeinic în README și/sau comentarii. Temele care au erori de compilare vor fi notate cu 0 puncte.

Resurse

Anexă

În anexă va fi prezentat un exemplu numeric pentru un bloc generic B, de dimensiune $4$x$4$, precum și detalii relevante pentru implementarea în Verilog.

Considerăm imaginea noastră de dimensiune $64$x$64$ pixeli, împărțită în blocuri de dimensiune $4$x$4$, pentru a putea efectua algoritmul de încapsulare a mesajului secret.

01_general


Pentru exemplificare considerăm primul bloc, format din intersecția primelor 4 rânduri cu primele 4 coloane. Valoarea minimă și valoarea maximă sunt marcate cu bold în figura de mai jos. Asupra lor se efectuează media aritmetică.

02_grayscale


Ulterior transformării imaginii din RGB în grayscale, se trece la compresie. Dacă pentru operația anterioară împărțirea pe blocuri nu e necesară, pentru compresie este obligatorie considerarea blocurilor individuale. După citirea elementelor ( se poate citi un singur pixel / ciclu de ceas ) se calculează media $AVG$, variația $var$, se construiește matricea cu noile valori $L_m$ și $H_m$. Bitmap-ul (matricea ce marchează tipul noului pixel) este o etapă intermediară care poate să fie inclusă în implementare, pentru o lizibilitate mai bună a algoritmului, dar nu este obligatorie.

03_compresie

Este recomandat ca stările automatului să aibă funcționalități bine determinate, cu o lungime a execuției potrivită (i.e. deși toată etapa de prelucrare a imaginii se poate face, din punct de vedere al simulării, într-un singur ciclu de ceas, frecvența de operare în practică va fi foarte mică datorită lungimii circuitului combinațional)


Ultima etapă presupune codarea mesajului în interiorul imaginii. Ordinea codării se consideră începând cu primul caracter de la final (LSB→MSB).
În fiecare bloc sunt codate 2 caractere (16 biți), întrucât folosirea a 3 caractere conduce la depășirea spațiului alocat. Așadar, în primul bloc vor fi secretizate caracterele cu indicii [15:8] și [7:0], EA. Caracterele se vor converti împreună din baza 2 în baza 3, folosind modulul base2_to_base3, și vom folosi primele 14 cifre (fiecare cifră e codată pe 2 biți) pentru a le încapsula în imagine. Ordinea este LSB → MSB, așa cum este prezentat și în imagine. Pixelii marcați cu roșu se omit, deoarece ei vor reprezenta baza pentru decodarea mesajului.
04_endcode


Aceste operații se efectuează pentru toate caracterele: 512 caractere, câte 2 în fiecare bloc, întrucât lungimea șirului nu este definită.

Pentru selecția unei secțiuni dinamice de 8 biți a unei variabile folosită într-o buclă iterativă, construcția aux[i+7:i] nu este permisă. Este necesară folosirea operatorului +: sau -:, astfel: aux[i+7-:8] sau aux[i+:8]. În acest fel sunt selectați biții din intervalul i, i+7. Mai multe detalii în Standardul Verilog 2000, Indexed Vector Part Selects, din resurse