In questo articolo vedremo una tecnica per nascondere in un file di tipo “PNG”, un documento di Microsoft Word, utilizzando la tecnica della steganografia, senza che l’immagine perda nitidezza.
La steganografia è la tecnica di nascondere un messaggio all'interno di un altro contenuto in modo che la sua stessa esistenza rimanga invisibile, una tecnica particolare, che si trova in vari ambiti.
L’articolo non vuole portare a conoscenza di tecniche che possono essere usate per scopi illeciti o per situazioni di mancato rispetto delle leggi, ma spiegare una tecnica informatica.
In particolare, vedremo come in un progetto di tipo “Windows Forms”, con il linguaggio di programmazione C# e la versione del Framework .Net 10, si poss inserire in un file immagine un documento Microsoft Word, di tipo docx.
Creazione del progetto
Si crea un nuovo progetto di tipo Windows forms, con l’ultima versione del Framework, nel momento in cui stiamo scrivendo, è la versione 10.
Una volta caricato il progetto, aggiungiamo due controlli di tipo “Button”, in uno impostiamo la proprietà “Name” con il valore “BtnNascondi”, e la proprietà “Text” con il valore “Nascondi”, in un altro controllo impostiamo la proprietà “Name” con il valore “BtnEstrapola” e la proprietà “Text” con il valore “Estrapola”.
Si crea un documento Microsoft Word, aggiungendo del testo e si salva in una cartella ben precisa. Nel nostro caso si troverà nella cartella denominata “Varie”. Si copia, o qualora non si ha a disposizione un file immagine di tipo “Png”, se ne crei uno, e si salva nella cartella “Varie”. La parte della creazione del progetto e dei file è terminata, non resta che scrivere il codice per nascondere l’immagine nel file immagine e per estrapolarlo dal file immagine.
Stesura del codice
Passiamo in visualizzazione codice della form, in un punto dentro classe “Form”, scriviamo una funzione, che dati tre parametri, quali, percorso e nome del file word, percorso e nome del file png, e percorso e nome del nuovo file, crei una nuova immagine png con il file word al suo interno.
Questa funzione manterrà in alterata la resa dell’immagine, senza perdere nitidezza.
Dopo aver letto lo stream byte dei due file presenti, effettuerà la creazione di un nuovo file, mettendo lo stream dati del file word alla fine dello stream dati del file immagine di tipo “png”.
Di seguito si riporta la funzione delle suddette operazioni nel linguaggio di programmazione C#
C#
private void NascondiDocxInPng(string pathImmaginePng, string pathDocx, string pathNuovoFilePng)
{
try
{
//Rilevo i byte del file immagine e del file doc
byte[] pngBytes = File.ReadAllBytes(pathImmaginePng);
byte[] docxBytes = File.ReadAllBytes(pathDocx);
//Marcatore per ritrovare il file dopo. 16 byte a caso
byte[] marcatore = { 0xDE, 0xAD, 0xBE, 0xEF, 0xCA, 0xFE, 0xBA, 0xBE,
0xDE, 0xAD, 0xBE, 0xEF, 0xCA, 0xFE, 0xBA, 0xBE };
//Creo il nuovo file unendo i due array byte
using (FileStream fs = new FileStream(pathNuovoFilePng, FileMode.Create))
{
fs.Write(pngBytes, 0, pngBytes.Length);
fs.Write(marcatore, 0, marcatore.Length);
fs.Write(BitConverter.GetBytes(docxBytes.Length), 0, 4);
fs.Write(docxBytes, 0, docxBytes.Length);
}
}
catch (Exception ex)
{
MessageBox.Show("Errore: " + ex.Message);
}
}
Passiamo in visualizzazione grafica e facciamo doppio click sul pulsante “BtnNascondi”, quello con la proprietà “Text” impostato su Nascondi, in modo da passare in visualizzazione codice nell’evento click del pulsante.
In questo evento verrà richiamata la funzione appena creata, passando i file word esistente, il file png esistente, ed il nuovo file immagine di tipo png, che conterrà al suo interno il file di Microsoft Word.
Di seguito si riporta il frammento di codice delle suddette operazioni.
C#
private void BtnNascondi_Click(object sender, EventArgs e)
{
NascondiDocxInPng(@"C:\varie\picchio.png", @"C:\varie\documento.docx", @"C:\varie\nuovaImmagine.png");
}
Una volta creato il file, dobbiamo creare una funzione, che permette di estrapolare dal file immagine il contenuto salvato.
Passiamo visualizzazione codice, e nella classe della form, in un qualunque parte, meglio se sotto la funzione creata in precedenza, scriviamo la funzione per l'operazione di estrazione. In particolare questa funzione permetterà di estrapolare il file Microsoft Word, salvato nel file png, che abbiamo creato in precedenza.
La funzione si aspetta due parametri, uno riguardante il percorso e nome del file png dal quale estrapolare il file Word, ed un parametro, con il nome e percorso nel file Word, che andremo a creare.
La funzione chiamerà un’altra funzione, per trovare l’indice in cui si trova il mercato, ed iniziare da quel punto, il rilevamento dei byte per la creazione del file Microsoft Word.
Di seguito si riporta la funzione per rilevare l’indice del marcatore nel file png.
C#
private int IndexOf(byte[] arrayBytePng, byte[] marcatore)
{
for (int i = 0; i < arrayBytePng.Length - marcatore.Length; i++)
{
bool trovato = true;
for (int j = 0; j < marcatore.Length; j++)
{
if (arrayBytePng[i + j] != marcatore[j]) { trovato = false; break; }
}
if (trovato) return i;
}
return -1;
}
Dopo aver creato la funzione per rilevare l’indice del marcatore, occorre creare una funzione che rileva l’array dei byte presenti nel file png riguardante il file Microsoft Word, e successivamente crea il file Word.
Di seguito si riporta la funzione per estrapolare l’array byte e creare il file Word.
C#
private void EstraiDocxDaPng(string pathPngConDocx, string pathOutputDocx)
{
try
{
byte[] tuttiBytes = File.ReadAllBytes(pathPngConDocx);
byte[] marcatore = { 0xDE, 0xAD, 0xBE, 0xEF, 0xCA, 0xFE, 0xBA, 0xBE,
0xDE, 0xAD, 0xBE, 0xEF, 0xCA, 0xFE, 0xBA, 0xBE };
//Trova il marcatore
int posizione = IndexOf(tuttiBytes, marcatore);
if (posizione == -1) throw new Exception("Nessun file trovato");
posizione += marcatore.Length;
int dimensioneDocx = BitConverter.ToInt32(tuttiBytes, posizione);
posizione += 4;
byte[] docxBytes = new byte[dimensioneDocx];
Array.Copy(tuttiBytes, posizione, docxBytes, 0, dimensioneDocx);
File.WriteAllBytes(pathOutputDocx, docxBytes);
}
catch (Exception ex)
{
MessageBox.Show("Errore: " + ex.Message);
}
}
Passiamo in visualizzazione grafica e facciamo doppio click sul pulsante quello per estrapolare il file word dal file immagine, nominato in precedenza con il valore “BtnEstrapola”, in questo modo passiamo in visualizzazione codice dell’evento click
In questo evento richiamiamo la funzione, passando come parametro il percorso e nome dell’immagine png contenente il file, ed un altro parametro indicando il percorso e nome del file Microsoft Word che verrà generato.
Di seguito si riporta il frammento di codice delle suddette operazioni.
C#
private void button1_Click(object sender, EventArgs e)
{
EstraiDocxDaPng(@"C:\varie\ nuovaImmagine.png", @"C:\varie\NuovoDocumento.docx");
}
Conclusioni
L’articolo ha voluto fornire al lettore, una tecnica per inserire in un file png un file di tipo Microsoft Word, inoltre è stata illustrata la tecnica per estrare il elativo contenuto.
Si fa presente che in caso che il file venga convertito in altro formato, quale jpg, si perderà la possibilità di estrare il file Microsoft Word. Possiamo inserire anche altre tipi di file, Microsoft Excel testo, ed altro ancora.