stepic 0.3 używa najprostszego podejścia do steganografii w obrazach. Cytując bezpośrednio z modułu:
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
Każdy oktet tajnych danych, a także flagi czy to ostatni bajt, jest ukryta w trzech kolejnych pikseli. Aby być bardziej precyzyjnym, stepic używa najmniej znaczących bitów z pierwszych trzech komponentów (często RGB) każdego piksela. Oczekuje brzydkie schemat dla strumienia RGBA z 4 bitami na składnik (D
oznacza danych E
oznacza końcówki strumienia)
| 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 ____ |
, ponieważ hałas wprowadzony tej zmiany jest mała w już „głośny” obrazy (jeden 256-ty), często nie można tego naprawdę wykryć wizualnie. Oznacza to, że cel tej techniki został osiągnięty: dane są ukryte na widoku, ponieważ nikt nie jest w stanie odróżnić tego od szumu.
To działa. Przynajmniej działa dla formatów bezstratnych, takich jak PNG. Niestety, JPG nie jest bezstratny, a jego kompresja najprawdopodobniej zmieni co najmniej jeden z zakodowanych bitów. Wystarczy zmienić dziewiąty bit, aby ta metoda była całkiem bezużyteczna, ponieważ wtedy ukryte dane zostaną obcięte do pojedynczego bajtu.
Steganografia w obrazach JPG jest nadal możliwa, w wielu postaciach, ale nie można tak naprawdę poprawić dekodowanych wartości pikseli. Lepszą (ale bardziej skomplikowaną) metodą może być ukrywanie danych w parametrach oszacowanych przez kompresor.
Być może problem polega na tym, że JPG jest formatem stratnym, a schemat steganograficzny w wersji stepic nie radzi sobie z błędami wprowadzonymi przez kompresję. Działa na przykład dla obrazów PNG. –
Tak, to było to. Dziwne, ponieważ widziałem kilka przykładów, gdzie używane są pliki .jpg. Pracował bezbłędnie dzięki .png Obrazy! Dzięki! – user2436704