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.
fonte
2013-05-30 15:37:39
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. –
Sì, era così. Strano, perché ho visto alcuni esempi in cui vengono utilizzati i file .jpg. Ha funzionato perfettamente con immagini .png! Grazie! – user2436704