МІНІСТЕРСТВО ОСВІТИ І НАУКИ МОЛОДІ ТА СПОРТУ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
ІКТА
кафедра ЗІ
З В І Т
до лабораторних робіт №1
з курсу «Методи і засоби стеганографії»
на тему: «Основні алгоритми стеганографії»
МЕТА РОБОТИ
Ознайомитися з основними алгоритмами стеганографії.
ТЕОРЕТИЧНІ ВІДОМОСТІ
Формат bmp-файлу
Формат bmp (від англ. BitMaP – бітова карта або бітовий масив) представляє нестиснуте (в основному) зображення. Цей файл складається з чотирьох частин: заголовку, інформаційного заголовку, таблиці кольорів (палітри) і даних зображення. Якщо у файлі зберігається зображення з глибиною кольору 24 біта (truecolor), то таблиця кольорів може бути відсутня.
Приховування даних в просторовій області
Цифрова стеганографія включає в себе наступні напрямки:
вбудовування інформації з метою її прихованої передачі;
вбудовування цифрових водяних знаків (ЦВЗ) (watermarking);
вбудовування ідентифікаційних номерів (fingerprinting);
вбудовування заголовків (captioning).
Алгоритми, що описуються в даному пункті, впроваджують ЦВЗ в області вихідного зображення. Їх перевагою є те, що для введенняЦВЗ немає необхідності виконувати обчислювально громіздкі лінійніперетворення зображень. ЦВЗ вводяться за рахунок маніпуляцій яскравістю l(x,y) або колірними складовими (r(x,y),b(x,y),g(x,y)).
Алгоритм LSB
LSB (Least Significant Bit, найменший значущий біт) - суть цього методу полягає в заміні останніх значущих бітів в контейнері на біти приховуваного повідомлення. Різниця між порожнім і заповненим контейнерами повинна бути не відчутна для органів сприйняття людини.Суть методу полягає в наступному: Припустимо, є 8-бітове зображення в градаціях сірого. 00h (00000000b) позначає чорний колір, FFh (11111111b) - білий. Усього є 256 градацій. Також припустимо, що повідомлення складається з 1 байта - наприклад, 01101011b. При використанні 2 молодших біт в описах пікселів, нам буде потрібно 4 пікселя. Припустимо, вони чорного кольору. Тоді пікселі, що містять приховане повідомлення, будуть виглядати наступним чином: 00000001 00000010 00000010 00000011. Тоді колір пікселів зміниться: першого - на 1 / 255, другого і третього - на 2 / 255 і четвертого - на 3 / 255. Такі градації, мало того що непомітні для людини, можуть взагалі не відобразитися при використанні низькоякісних пристроїв виводу.
Розглянемо ще один приклад. Кожен колір (піксель) кодується одним байтом (8 біт). У нас таких кольору три (червоний, синій, зелений) разом 3 байти (24 біта). Щоб записати нашу інформацію і при цьому не спотворити зображення, запишемо дані в молодші біти кольорів зображення. Тобто ми візьмемо піксел, розберемо його на складові кольору і замінимо молодші біти бітами нашого повідомлення.
Це 1 байт нашого повідомлення:10101010
Це RGB нашого пікселя:R: 11110000G: 00001000B: 11001000
Замінимо молодші біти і отримаємо новий піксель:R: 11110010G: 00001101B: 11001010
Дана операція не внесе до зображення помітних людському оку спотворень.
Методи LSB є нестійкими до всіх видів атак і можуть бути використані тільки при відсутності шуму в каналі передачі даних. Виявлення LSB-кодованого стего здійснюється з аномальних характеристикам розподілу значень діапазону молодших бітів відліків цифрового сигналу.
Розрахунок кількості можливих сиволів з розрахунку 1 біта в байті
N= Ширина(пікселі)* Довжина(пікселі)*3(R,G,B)/8
Розрахунок кількості можливих сиволів з розрахунку 2 біта в байті
N= Ширина(пікселі)* Довжина(пікселі)*6(R,G,B)/8
Розрахунок кількості можливих сиволів з розрахунку 3 біта в байті
N= Ширина(пікселі)* Довжина(пікселі)*9(R,G,B)/8
Розрахунок кількості можливих сиволів з розрахунку 4 біта в байті
N= Ширина(пікселі)* Довжина(пікселі)*12(R,G,B)/8
Блок схема
Код Програми
import Image
# Функція, яка реалізує меню програми і запускає інші потрібні для виконання роботи програми функції
def main():
print "Hi, user"
while True:
print "What do you want to do?"
vidpovid=raw_input("""1 - cript
2 - decript
3 - Exit
""")
if vidpovid=="1":
way=raw_input( "Give the way: ")
print "Posible count of symbol:",kilkist_simvolov(way)
text=raw_input("Print a text:")
coder(text,way)
break
elif vidpovid=="2":
way=raw_input( "Give the way: ")
k=get(way)
print "Decoded text is:",k
mission()
break
elif vidpovid=="3": break
else:
print "Vvedit pravelniy nomer"
#Функція, яка переводить стрічковий тип в потік бітів
def z_string_v_bit(string):
k=''
for x in string:
l=bin(ord(x))
l=l[2:]
while len(l)<=7:
l="0"+l
k+=l
return k+'011000000110000001100000'
# Функція, яка переводить потік бітів в стрічковий тип
def z_bit_v_string(bit):
k=""
while len(bit)>0:
s=bit[0:8]
m=chr(int(("0b"+s),2))
k+=m
if len(bit)<9: break
bit=bit[8:]
return k
#Функція, яка вираховує кількість можливих для запису символів у картинці
def kilkist_simvolov(way):
z=-1
Im = Image.open(way)
k=Im.format
p=Im.mode
if k!="BMP" and p!="RBG": return z
l=Im.size
z=l[0]*l[1]*3*2/10-3
return z
# Функція, яка конвертує цілі числа(0-255) в біти
def konverter(r,g,b):
k=["","",""]
s=0
l=[r,g,b]
for x in l:
m=bin(x)
k[s]=m
k[s]=k[s]
if len(k[s][0:2])<8:
k[s]=k[s][2:]
while len(k[s])<=7:
k[s]="0"+k[s]
k[s]="0b"+k[s][:-2]
s+=1
return k[0],k[1],k[2]
def mission():
print "Mission is done"
#Функція, яка міняє останні біти
def put(rb,gb,bb, dani):
l=[rb,gb,bb]
k=["","",""]
s=0
for x in l:
k[s]=x+dani[0:2]
dani=dani[2:]
s+=1
return k[0],k[1],k[2],dani
#Функція, яка кодує повідомлення в картинку
def coder(text,way):
Im = Image.open(way)
rgb_im = Im.convert('RGB')
l=Im.size
string=text
dani=z_string_v_bit(string)
for x in range(1,l[0]):
for y in range(1,l[1]):
r, g, b = rgb_im.getpixel((x, y))
rb,gb,bb=konverter(r,g,b)
if dani=="":
Im.save(way,"BMP")
return mission()
rb,gb,bb,dani=put(rb, gb,bb,dani)
Im.putpixel((x,y),(int(rb,2),int(gb,2),int(bb,2)))
#Функція, яка декодує повідомлення з картинки
def get(way):
Im = Image.open(way)
dani=""
text=''
rgb_im = Im.convert('RGB')
l=Im.size
for x in range(1,l[0]):
for y in range(1,l[1]):
r, g, b = rgb_im.getpixel((x, y))
r, g, b=dekonverter(r,g,b)
s=r[-2:]+g[-2:]+b[-2:]
dani+=s
if dani.find("011000000110000001100000")>-1:
dani=dani[0:dani.find("011000000110000001100000")]
k=z_bit_v_string(dani)
return k
def dekonverter(r,g,b):
k=["","",""]
s=0
l=[r,g,b]
for x in l:
m=bin(x)
k[s]=m
if len(k[s][0:2])<8:
k[s]=k[s][2:]
while len(k[s])<=7:
k[s]="0"+k[s]
k[s]="0b"+k[s]
s+=1
return k[0],k[1],k[2]
main()
Шифрування останніх 2 біт
Шифрування 4 останніх біт
Результат роботи програми
Зашифрування
Розшифрування
Висновок: Під час виконання даної роботи я навчився працювати з графічними бібліотеками Python, вивчив основні методи приховування інформації в зображенні.