User Tools

Site Tools


user:sachy:svgsteg

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

user:sachy:svgsteg [2017/08/03 19:46] – created sachyuser:sachy:svgsteg [2017/08/03 20:28] (current) – pridan testovaci svg sachy
Line 1: Line 1:
 +===== Vektorova steganografie =====
 +
 +Na skryte zapisovani dat do bitmap existuje spousta nastroju, ale jeste vic clanku, bakalarek a diplomek na jejich detekci a ziskani. To same plati pro video a zvuk - proste se jemne deformace ztrati v sumu.
 +
 +Naproti tomu vektory nabizi moznost zapisu informace bez kvalitativni zmeny vystupu.
 +
 +Zakladni metody jsou:
 +  * Jittering - zmeny nejnizsich bitu barev/pozic/delek nebo pridavani nevyznamnych nul na zacatek integeru/konec floatu
 +  * Segmentace - rozdeleni usecek na mensi casti (pouzivaji se dva body - pivot (je dana usecka zakodovana?) a bod (ktery bud existuje=1, nebo ne=0) v pevne danych pomerech delek). Hlavni nevyhodou je ztrata informace pri pruchodu optimalizatorem (ktery nadbytecne body na rovne usecce vyhodi).
 +  * Polygonizace - prevedeni (Bezierovych) krivek na polygon, hlavni vyhodou je moznost ulozit velke mnozstvi informace do jednoho segmentu, a polygonizace vypada nenapadne (vykonnostni duvody).
 +  * Pridani novych objektu ktere splynou s pozadim/jsou prekryty jinym objektem. Nevyhodou je slozitejsi zpracovani (generator musi umet zpracovat vysledny obraz, nestaci parsovat XML.
 +
 +Proof-of-koncept svgsteg.sh 
 +<code>
 +#!/bin/bash
 +#
 +# Read SVG file "$1" and write msg "$2" to file "$3"
 +#
 +
 +cp -f "$1" "$3"
 +
 +bits=$(cat "$3" | grep -o -e '[0-9]\+\.[0-9]\{2,\}' | wc -l)
 +msgb=$(echo "$2" | perl -pe 'local $/; $_=unpack"B*"')
 +msgl=$(echo "$msgb" | tr -d '\n' | wc -c)
 +msgbl=$(echo $msgl | awk '{print "ibase=10;obase=2;" $msgl}' | bc | xargs printf "%064d\n")
 +msgfull="$msgbl$msgb"
 +
 +if [ $(($msgl + 64)) -gt "$bits" ]
 +then
 + echo "Msg too big or SVG too simple";
 + exit;
 +fi
 +
 +nums=$(cat "$3" | grep -o -e '[0-9]\+\.[0-9]\{2,\}')
 +
 +i="1"
 +echo "$msgfull" | tr -d '\n' | while IFS= read -r -n1 bit; do
 +
 + num=$(echo "$nums" | head -n "$i" | tail -n 1)
 +
 + ldigit=$(echo "$num" | grep -o -e '[0-9]$')
 + odd=$(( $ldigit & 1))
 +
 + # if already even or already odd; do nothing
 + # if even shall be odd; add one to least place (ignore overflow)
 + # if odd shall be even; add one to least place (ignore overflow)
 +
 + if [[ $bit != $odd ]]
 + then
 + # add 1 to $ldigit, but store only last digit (in case 9->10 = 0)
 + newldigit=$(echo $(($ldigit + 1)) | grep -o -e '[0-9]$')
 + # get updated number
 + upnum=$(echo "$num" | sed -e "s/[0-9]$/$newldigit/g" -r)
 +
 + # update the file
 + sed -n "1h;2,\$H;\${g;s/[0-9]\+\.[0-9]\{2,\}/$upnum/$i;p}" -i "$3"
 +
 + fi
 +
 + i=$(($i + 1))
 +done
 +</code>
 +
 +A dekoder svgunsteg.sh
 +<code>
 +#!/bin/bash
 +#
 +# Get message from SVG file $1
 +#
 +
 +msg=""
 +
 +nums=$(cat "$1" | grep -o -e '[0-9]\+\.[0-9]\{2,\}')
 +
 +i="1"
 +echo "$nums" | while IFS= read num; do
 + ldigit=$(echo $num | grep -o -e '[0-9]$')
 + odd=$(($ldigit & 1))
 +
 + msg="$msg$odd"
 +
 + if [[ $i = "64" ]]
 + then
 + mlen="$((2#$msg))"
 + msg=""
 + fi
 +
 + if [[ $i = "$(($mlen+64))" ]]
 + then
 + echo "$msg" | perl -lpe '$_=pack"B*",$_'
 + exit
 + fi
 +
 + i=$(($i + 1))
 +done
 +</code>
 +
 +{{:user:sachy:bagr5.svg|Obrazek se skrytou informaci}}