user:sachy:svgsteg
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
#!/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
A dekoder svgunsteg.sh
#!/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
user/sachy/svgsteg.txt · Last modified: 2017/08/03 20:28 by sachy