La maggior parte degli algoritmi steganografici si articola di sottoprocessi (fasi) per l'embedding del messaggio segreto nel contenitore. Le fasi più importanti per un algoritmo e quindi un programma steganografico sono qui elencate.
Trovare i bits ridondanti
I bits ridondanti sono quei bits del contenitore che, anche se rimpiazzati non modificano significativamente le proprietà informative del contenitore stesso.
Tutti i files, in quantità differenti, contengono bits ridondanti, per cui possiamo affermare che la steganografia può essere sempre applicata. Il problema sta nel dove andarli a cercare, perché potrebbero essere pochi e trovarli risulterebbe un'inutile impresa, ma soprattutto perché devono essere cercati in posizioni differenti a seconda del tipo di file che si utilizza come contenitore.
Ad esempio, una tecnica standard per cover BMP considera ridondante il bit meno significativo di ogni byte. D'altro canto, esistono tecniche che analizzano i contenitori BMP: una di queste è la BPCS Steganography inventata da Eiji Kawaguchi nel 1997. L’idea è di usare, anziché i soli bits meno significativi, intere regioni di bits come potenziali aree da sovrascrivere. Analizzeremo questa tecnica in modo più dettagliato successivamente.
Nella quasi totalità dei casi, il numero dei bits da nascondere non combacia con il numero di bits ridondanti. Se i bits del messaggio segreto superano i bits ridondanti, l’operazione non può essere effettuata. Se, viceversa, i bits ridondanti sono in superiorità, bisogna selezionarne un sottoinsieme (Cover Bits) che sarà sostituito dai bits del messaggio segreto.
Sia n il numero di bits necessari per nascondere il messaggio segreto. L’approccio naive consiste nel sostituire i primi n bits ridondanti.
Per esempio, però, considerando ancora immagini di tipo BMP, con un tipo di attacco (attacco visuale) il messaggio può essere facilmente scoperto perché si riesce a notare la differenza tra la prima parte dell'immagine e la seconda.
La stessa cosa, avverrebbe se si considerasse un cover WAV. La prima parte del suono avrebbe una qualità diversa dalla seconda e risalterebbe il fatto che c'è qualcosa di losco da scoprire.
è desiderabile che ogni Cover Bit sia scelto con la stessa probabilità rispetto agli altri in modo tale da non rendere alcune regioni del cover più utilizzate come copertura rispetto ad altre.
Una tecnica[5] che raggiunge questo scopo lavora come segue: le posizioni dei bits ridondanti vengono modificate secondo una permutazione pseudo-randomizzata che dipende dalla chiave segreta data in input. La permutazione generata deve essere computazionalmente sicura, il che significa che non è possibile indovinare la permutazione senza conoscere la chiave. I Cover Bits vengono scelti prendendo le prime n posizioni dei bits ridondanti dopo l'applicazione della permutazione. Questo metodo assicura una eguale distribuzione dei Cover Bits su tutto lo spazio dei bits ridondanti, rendendo difficili attacchi simili a quelli citati.
L'embedding consiste nell'incapsulamento vero e proprio del messaggio segreto all'interno del cover, ovvero, nel modificare i Cover Bits individuati nella fase precedente.
Vi sono molte tecniche di embedding. Le più usate non fanno altro che sovrascrivere i Cover Bits con i bits del messaggio segreto.
Per completare l'esempio, quando si utilizzano immagini BMP come cover, i Cover Bits sono costituiti dal bit meno significativo di ogni byte, quindi, effettuare l'embedding significa rimpiazzare i bits meno significativi con i bits del messaggio segreto. Il vantaggio di questa tecnica consiste nella grossa capacità che un cover può assicurare (ogni Cover Bit può essere rimpiazzato con un bit segreto); d’altra parte, è facile mostrare che con attacchi statistici e visuali si può risalire al messaggio segreto.
Una tecnica che incapsula più di 2 bits segreti per volta nel cover è chiamata matrix-encoding[6] che usa 3 parametri (il cui metro per la scelta viene descritto di seguito) e lavora come segue.
Vengono selezionati n bits tra i Cover Bits per incapsulare k bits del messaggio segreto cambiando al più d bits. Ad esempio, se k=2, n=3 e d=1 si inseriscono 2 bits segreti in 3 Cover Bits modificando al più uno solo dei Cover Bits.
Siano a, b e c rispettivamente il primo, il secondo e il terzo Cover Bit in considerazione. Consideriamo i 2 bits segreti x e y:
Se a, b e c sono tali che x = (a XOR c) e y = (b XOR c) (accade con probabilità 1/4) non si fa nulla;
Se x = (a XOR c) ma y ≠ (b XOR c) allora deve essere cambiato b (al suo valore negato);
Viceversa, se x ≠ (a XOR c) ma y = (b XOR c), deve essere cambiato a;
Se entrambe le condizioni sono false allora è c a dover essere sostituito con il suo negato.
Ad esempio, se gli n=3 Cover Bits sono a=1, b=1, c=0 e i bits segreti sono x=0 e y=1 ci troviamo nella seguente situazione:
x = (a XOR c) ovvero 0 = (1 XOR 0)
y ≠ (b XOR c) infatti 1 ≠ (1 XOR 0),
quindi deve essere modificato il solo bit b da 1 a 0.
Le altre situazioni sono simili ed è da notare come al più uno dei tre Cover Bits vada cambiato.
Questa tecnica assicura una buona capacità del cover combinata con una ottima qualità di nascondimento.
Se si vogliono usare valori più grandi di n e k esistono altre procedure simili che rendono la vita difficile agli attaccanti perché diventa molto difficile individuare il messaggio segreto, ma questo implica una capacità del cover assai minore.