МІНІСТЕРСТВО ОСВІТИ І НАУКИ МОЛОДІ ТА СПОРТУ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
ІКТА
кафедра ЗІ
З В І Т
до лабораторних робіт №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: 11110000
G: 00001000
B: 11001000
Замінимо молодші біти і отримаємо новий піксель:
R: 11110010
G: 00001101
B: 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, вивчив основні методи приховування інформації в зображенні.