2013-05-30 7 views
7

Utilizzo di Stepic 0.3. Sto eseguendo i comandi per codificare un messaggio in un'immagine JPG. Il codice che uso è la seguente: i datiSteganography in Python - Stepic

from PIL import Image 
import stepic 

im = Image.open ("tester.jpg") 
im2 = stepic.encode(im, '0987639987069730979076409784690y7689734') 
im2.save('stegtest.jpg') 
im1 = Image.open('stegtest.jpg') 
s = stepic.decode(im1) 
print s 
data = s.decode() 
print data 

Eppure la stampa S e la stampa mi danno un valore simile: 6` o qualche altro charcter strano. Penso che sto usando le funzioni come dovrebbero essere usate, perché non ottengo risultati corretti?

+2

Forse il problema risiede nel fatto che JPG è un formato lossy, e il regime steganografico in stepic non può trattare con gli errori introdotti dalla compressione. Funziona per immagini PNG, per esempio. –

+0

Sì, era così. Strano, perché ho visto alcuni esempi in cui vengono utilizzati i file .jpg. Ha funzionato perfettamente con immagini .png! Grazie! – user2436704

risposta

5

stepic 0.3 utilizza l'approccio più semplice alla steganografia nelle immagini. Citando direttamente dal modulo:

def decode_imdata(imdata): 
    '''Given a sequence of pixels, returns an iterator of characters 
    encoded in the image''' 

    imdata = iter(imdata) 
    while True: 
     pixels = list(imdata.next()[:3] + imdata.next()[:3] + imdata.next()[:3]) 
     byte = 0 
     for c in xrange(7): 
      byte |= pixels[c] & 1 
      byte <<= 1 
     byte |= pixels[7] & 1 
     yield chr(byte) 
     if pixels[-1] & 1: 
      break 

Ogni ottetto di dati segreti, oltre a una bandiera che si tratti di all'ultimo byte, è nascosto in tre pixel consecutivi. Per essere più precisi, stepic utilizza i bit meno significativi dei primi tre componenti (spesso RGB) di ciascun pixel. Vedere questo molto brutto diagramma, per un flusso RGBA con 4 bit per componente (D significa dati, E mezzi di fine-stream):

    | pixel 0    | pixel 1    | pixel 2    | 
image viewer sees: | rrrr gggg bbbb aaaa | rrrr gggg bbbb aaaa | rrrr gggg bbbb aaaa | 
stepic sees:  | ___D ___D ___D ____ | ___D ___D ___D ____ | ___D ___D ___E ____ | 

Poiché il rumore introdotto dal questo cambiamento è piccola, già "noisy" immagini (un 256 °), spesso non è possibile rilevarlo visivamente. Ciò significa che l'obiettivo di questa tecnica si ottiene: il dato è nascosto in bella vista, perché nessuno può distinguerlo da naturalmente che si verificano rumore.

Questo funziona. Almeno, funziona per formati lossless, come PNG. Ahimè, JPG non è senza perdite e la sua compressione molto probabilmente cambierà almeno uno dei bit codificati. Basta cambiare il nono bit per rendere questo metodo abbastanza inutile, da allora i dati nascosti saranno troncati a un singolo byte.

steganografia in immagini JPG è ancora possibile, in molte forme, ma non si può davvero solo modificare i valori dei pixel decodificati. Un metodo migliore (ma più complicato) potrebbe essere quello di nascondere i dati nei parametri stimati dal compressore.