2013-05-30 14 views
7

Korzystanie z programu Stepic 0.3. Wykonuję polecenia, aby zakodować wiadomość na obraz JPG. Kod używam jest następujący: daneSteganografia w python - krokowy

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 

Jednak druk S i drukowanie dać mi wartości takich jak: 6` lub innej dziwnej charcter. Myślę, że używam tych funkcji, które powinny być używane, dlaczego nie otrzymam właściwych wyników?

+2

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. –

+0

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

Odpowiedz

5

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.