Tuesday, 17 December 2013

Steganography 2

Do you remember my old post about steganography? It's here: http://rebol.informe.com/blog/2012/10/10/steganography/

Now I'll sow you another post, but it's all line command driven. Let's see an example:

message: "I love Steganography!!"
key: "1234"

img: img-load-or-create %test.png
img-save %crypted.png (img-encode message key img)


Now image file crypted.png contains a secret message. To retrieve your message:


img: img-load-or-create %crypted.png
print img-decode key img


Here is the source code:

REBOL [
    Title: "Steganography"
    Description: "Ukrywanie informacji tekstowych w plikach graficznych"
    Purpose: "Functions to hide text data in the noise pixels of an image"
    Date: 2007/01/10
    Version: 1.1.0
    Author: "Piotr Gapinski"
    Email: {news [at] rowery! olsztyn.pl}
    File: %steganography.r
    Url: http://www.rowery.olsztyn.pl/wspolpraca/rebol/steganography/
    Copyright: "Olsztynska Strona Rowerowa http://www.rowery.olsztyn.pl"
    License: "GNU Lesser General Public License (Version 2.1)"
]
ctx-steganography: context [
    greyscale: false
    set 'img-load-or-create func [
        "Wczytuje plik graficzny lub tworzy obrazek o kolorze bialym."
        imgname [string! file!] "nazwa pliku do wczytania"] [
        any [
            attempt [load to-file imgname]
            make image! reduce [300x300 white]
        ]
    ]
    set 'img-save-png func [
        "Zapisuje dane graficzne do pliku PNG"
        imgname [string! file!] "nazwa pliku"
        img [image!] "dane grafine do zapisania"] [
       
        save/png (to-file imgname) img
    ]
    set 'img-encode func [
        "Koduje wiadomosc kluczem i umieszcza w pliku graficznym."
        text [string!] "wiadomosc do zakodowania"
        key [string!]   "klucz prywatny kodowanych danych"
        img [image!] "obrazek w ktorym beda umieszczone dane"
        /local text-len rgb r g b key-len key-index color-index byte k color i] [
       
        text-len: length? text
       
        ;; zakoduj długosc wiadomosci w pierwszym pixelu
        pixel: 1
        rgb: to-tuple reduce [
            r: to-integer (text-len / power 2 2)
            g: to-integer (text-len - (r * power 2 2)) / power 2 1
            b: to-integer (text-len - (r * power 2 2) - (g * power 2 1))
        ]
        poke img pixel rgb
       
        key-len: length? key
        key-index: color-index: i: 1 ;; skladowa rgb w ktorej bedzie umieszczony zakodowany bajt
       
        foreach byte text [
            pixel: pixel + (to-integer key/:key-index)
            rgb: img/:pixel
           
            crypted-value: to-integer (byte xor key/:key-index)
            either greyscale [
                rgb: to-tuple reduce [crypted-value crypted-value crypted-value]
            ][rgb: poke rgb color-index crypted-value ]
            poke img pixel rgb
           
            key-index: (i // key-len) + 1
            color-index: (i // 3) + 1
            i: i + 1
        ]
        return img
    ]
    set 'img-decode func [
        "Rozkodowuje wiadomosc z pliku graficznego na podstawie klucza."
        key [string!] "klucz prywatny zakodowanych danych"
        img [image!] "obrazek zawierajacy zakodowane dane"
        /local text pixel text-len key-len key-index color-index i] [
        ;; długosc wiadomosci jest zakodowana w pierwszym pixelu
        pixel: 1
        text: copy ""
        text-len: to-integer ((img/:pixel/1 * power 2 2) + (img/:pixel/2 * power 2 1) + img/:pixel/3)
        key-len: length? key
        key-index: color-index: i: 1 ;; skladowa rgb w ktorej bedzie umieszczony zakodowany bajt
       
        loop text-len [
            pixel: pixel + to-integer key/:key-index
            byte: img/:pixel/:color-index
            append text (to-char byte) xor key/:key-index
           
            key-index: (i // key-len) + 1
            color-index: (i // 3) + 1
            i: i + 1
        ]
        return text
    ]
]

No comments:

Post a Comment