KRYPTOGRAFIA I OCHRONA DANYCH PROJEKT



Podobne dokumenty
Analiza i Przetwarzanie Obrazów. Szyfrowanie Obrazów. Autor : Mateusz Nawrot

// Potrzebne do memset oraz memcpy, czyli kopiowania bloków

GRAFIKA RASTROWA. WYKŁAD 1 Wprowadzenie do grafiki rastrowej. Jacek Wiślicki Katedra Informatyki Stosowanej

ANALIZA I INDEKSOWANIE MULTIMEDIÓW (AIM)

Formaty obrazów rastrowych biblioteki PBM

Grafika rastrowa (bitmapa)-

Detekcja twarzy w obrazie

Implementacja filtru Canny ego

Materiały: kartki papieru (5 x 5 kolorów), piłeczki pingpongowe (5 x 5 kolorów), worek (nieprzeźroczysty).

Przykładowa dostępna aplikacja w Visual Studio - krok po kroku

Maciej Piotr Jankowski

Streszczenie Komputery do przechowywania rysunków, zdjęć i innych obrazów używają tylko liczb. Te zajęcia mają ukazać w jaki sposób to robią.

Algorytmy i złożoności. Wykład 3. Listy jednokierunkowe

Algorytm. a programowanie -

dr inż. Piotr Odya dr inż. Piotr Suchomski

Strategia "dziel i zwyciężaj"

Zalogowanie generuje nowe menu: okno do wysyłania plików oraz dodatkowe menu Pomoc

Podstawy OpenCL część 2

Klasy i obiekty cz II

Python: JPEG. Zadanie. 1. Wczytanie obrazka

Ćwiczenie 1 Automatyczna animacja ruchu

autor poradnika - KS Jak zamieszczać i edytować artykuły na szkolnej stronie internetowej

Rysowanie punktów na powierzchni graficznej

Lista dwukierunkowa - przykład implementacji destruktorów

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Pętle i tablice. Spotkanie 3. Pętle: for, while, do while. Tablice. Przykłady

2. Tablice. Tablice jednowymiarowe - wektory. Algorytmy i Struktury Danych

Programowanie w JAVA Lab. 5 - Wątki. 1. Wykorzystując metodę Monte Carlo narysować wykres funkcji oraz obliczyć całkę: 7 x ) xy, 8,8

Aplikacje WWW - laboratorium

Strumienie, pliki. Sortowanie. Wyjątki.

Laboratorium 7 Blog: dodawanie i edycja wpisów

Układy VLSI Bramki 1.0

Algorytmy. 1. Sortowanie 2. Statki i okręty. programowanie cz.7. poniedziałek, 2 marca 2009

Budowa i generowanie planszy

Aplikacje WWW - laboratorium

Formaty plików graficznych - wprowadzenie

Podstawy grafiki komputerowej. Teoria obrazu.

Raport Hurtownie Danych

Tom 6 Opis oprogramowania Część 8 Narzędzie do kontroli danych elementarnych, danych wynikowych oraz kontroli obmiaru do celów fakturowania

Allegro5 3/x. Przykład wklejamy go do dev'a zamiast kodu domyślnego dal programu z allegro i kompilujemy.

Architektury systemów rozproszonych LABORATORIUM. Ćwiczenie 1

lekcja 8a Gry komputerowe MasterMind

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

c) Sprawdź, czy jest włączone narzędzie Image classification. Jeśli nie, to je włącz: Customize Toolbars Image Classification

1. Przypisy, indeks i spisy.

Przy dużej wielkości głębokości uzyskamy wrażenie nieskończoności: Dla głębokości zerowej uzyskamy tekst płaski:

Część XV C++ Ćwiczenie 1

Ćwiczenie 12 Różdżka, szybkie zaznaczanie i zakres koloru

Podstawy technologii WWW

Zasady programowania Dokumentacja

Waldemar Izdebski - Wykłady z przedmiotu SIT / Mapa zasadnicza 30

Obsługa modułu. e-deklaracje. w programach WF-FaKir oraz WF-Gang. (opracował Przemysław Gola)

Zadanie Wstaw wykres i dokonaj jego edycji dla poniższych danych. 8a 3,54 8b 5,25 8c 4,21 8d 4,85

Przewodnik po soczewkach

Algorytmy i Struktury Danych. Anna Paszyńska

- 1 Laboratorium fotografii cyfrowej Foto Video Hennig

Podstawy programowania Laboratorium. Ćwiczenie 2 Programowanie strukturalne podstawowe rodzaje instrukcji

Zadanie 1: Protokół ślepych podpisów cyfrowych w oparciu o algorytm RSA

Wybieramy File->New->Project Wybieramy aplikację MFC->MFC Application jak na rysunku poniżej:

Program do konwersji obrazu na cig zero-jedynkowy

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

Wykład VI. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

Rozdział 3. Zapisywanie stanu aplikacji w ustawieniach lokalnych

Instrukcja integratora - obsługa dużych plików w epuap2

Szablony funkcji i klas (templates)

- - Ocena wykonaniu zad3. Brak zad3

Testowanie modeli predykcyjnych

Programowanie platform mobilnych PocketPC

Wykorzystanie grafiki wektorowej do tworzenia elementów graficznych stron i prezentacji

Ćwiczenie 1. Kolejki IBM Message Queue (MQ)

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

ZASADY PROGRAMOWANIA KOMPUTERÓW ZAP zima 2014/2015. Drzewa BST c.d., równoważenie drzew, kopce.

Rozpoznawanie obrazu. Teraz opiszemy jak działa robot.

Programowanie obiektowe

Programowanie funkcyjne wprowadzenie Specyfikacje formalne i programy funkcyjne

Krzysztof Leszczyński Adam Sosnowski Michał Winiarski. Projekt UCYF

1. Tworzenie nowego projektu.

Programowanie i struktury danych

Site Installer v2.4.xx

Polbruk Antara II Polbruk Neo

Instrukcja wstawiania materiałów dydaktycznych do bloku tematycznego scenariusza lekcji z geografii na szkolnej platformie e-learningowej Moodle

Złożoność obliczeniowa zadania, zestaw 2

Listy powiązane zorientowane obiektowo

Wykład VII. Systemy kryptograficzne Kierunek Matematyka - semestr IV. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej


CalendarGenerator v0.1 - instrukcja obsługi

Liczby losowe i pętla while w języku Python

Skrócona instrukcja pracy z Generatorem Wniosków

Programowanie w VB Proste algorytmy sortowania

Podstawy tworzenia prezentacji w programie Microsoft PowerPoint 2007

OBSŁUGA PRACY DYPLOMOWEJ W APD PRZEZ STUDENTA

Matematyka dyskretna - wykład - część Podstawowe algorytmy kombinatoryczne

Tom 6 Opis oprogramowania

Programowanie obiektowe

Zaawansowane aplikacje WWW - laboratorium

Metody Metody, parametry, zwracanie wartości

Matematyka podstawowa X. Rachunek prawdopodobieństwa

Programowanie obiektowe

Transkrypt:

KRYPTOGRAFIA I OCHRONA DANYCH PROJEKT Temat: Zaimplementować system kryptografii wizualnej http://www.cacr.math.uwaterloo.ca/~dstinson/visual.html Autor: Tomasz Mitręga NSMW Grupa 1 Sekcja 2

1. Temat projektu Zrealizować program pozwalający na tworzenie dwóch obrazów które podzielone przypominają szum, a po złożeniu tworzą czytelną wiadomość. Program powinien pozwalać na połączenie obu obrazów w celu odczytania zakodowanej wiadomości. Odczytanie z jednego obrazu nie powinno być możliwe. Dla każdego piksela generowana będzie losowo z prawdopodobieństwem 0,5 jedna z dwóch możliwych jego reprezentacji w bitmapach wyjściowych. Pozwoli to na zagwarantowanie niemożności odczytania ukrytej informacji na podstawie tylko jednej bitmapy. Program powinien przekształcać monochromatyczne pliki map bitowych. 2. Analiza rozwiązania Kryptografia wizualna jest sposobem takiego zakodowania obrazu monochromatycznego lub tekstu aby po podziale obrazu treść w nim zapisana nie była możliwa do odczytania. Po poprawnym połączeniu dwóch obrazów bez większej trudności zawartość dało była zrozumiała. Algorytm zaimplementowany przeze mnie został po raz pierwszy zaprezentowany przez Moni Naor i Adi Shamir na międzynarodowej konferencji EUROCRYPT w 1994 roku. Polega on na podziale obrazu wejściowego na dwa obrazy wyjściowe. Każdy piksel z obrazu źródłowego jest dzielony na 2 subpiksele. Jeśli wybrany piksel w obrazie wejściowym ma kolor biały to zostaje on podzielony na 2 subpiksele i z prawdopodobieństwem 0,5 wybierana jest kombinacja czarnybiały, czarny-biały lub biały-czarny, biały-czarny jeśli jednak piksel jest czarny wybierane są piksele czarny-biały, biały-czarny lub biały-czarny, czarny-biały. Zależności między pikselami przedstawia poniższa tabelka. Pixel Prawdopodobieństwo Piksel w obrazie 1 Piksel w obrazie 2 Piksele po połączeniu P = 0,5 P = 0,5 P = 0,5 P = 0,5 Złączenie obrazów polega na wpisaniu w miejsca białych pikseli z obrazu pierwszego czarnych pikseli z obrazu drugiego.

3. Przykład działania programu Na poniższych ilustracjach został przedstawiony program podczas działania. Rysunek 1 Zakodowany rysunek Powyższy rysunek przedstawia oryginalny obraz oraz obrazy utworzone poprzez zastosowanie zaimplementowanego algorytmu.

Rysunek 2 Rysunek po odkodowaniu Rysunek 2 przedstawia wygenerowane w poprzednim kroku obrazy po ich połączeniu. W programie mamy możliwość oczyszczenia obrazu ze zbędnych czarnych pikseli, oraz zapisania obrazu wynikowego do pliku. 4. Opis algorytmu Algorytm tworzenia zakodowanych map bitowych. 1 public void makecrypto() 2 { 3 Bitmap b1 = new Bitmap(src.Width + (src.width % 2), src.height); //pierwsza bitmapa wynikowa 4 Bitmap b2 = new Bitmap(src.Width + (src.width % 2), src.height); //druga bitmapa wynikowa 5 Random r = new Random(); // Random słuŝący do losowania liczby 6 int rand = -1; // Losowanie liczby 1 lub 0 z prawdopodobieństwem 1/2 7 this.form.invoke(this.form.startth, null); 8 for (int i = 0; i < src.width; i += 2) //przechodzimy po co drugim pikselu bitmapy Ŝródłowej (szerokość) 9 { 10 for (int j = 0; j < src.height; j++) //przechodzimy po kaŝdym pikselu bitmapy Ŝródłowej (wysokość) 11 { 12 rand = r.next(2); //losujemy liczbę 13 if (src.getpixel(i, j).toargb() == Color.White.ToArgb()) //jeśli pobrany piksel jest biały 14 { 15 if (rand == 0) // w zaleŝności od wylosowanej liczby ustawiamy piksele

16 { 17 b1.setpixel(i, j, Color.Black); //w obrazie 1 i na czarny 18 b1.setpixel(i + 1, j, Color.White); //w obrazie 1 i+1 na biały 19 b2.setpixel(i, j, Color.Black); //w obrazie 2 i na czarny 20 b2.setpixel(i + 1, j, Color.White); //w obrazie 2 i+1 na biały 21 } 22 else 23 { 24 b1.setpixel(i, j, Color.White); //w obrazie 1 i na biały 25 b1.setpixel(i + 1, j, Color.Black); //w obrazie 1 i+1 na czarny 26 b2.setpixel(i, j, Color.White); //w obrazie 2 i na biały 27 b2.setpixel(i + 1, j, Color.Black); //w obrazie 2 i+1 na czarny 28 } 29 } 30 else //jeśli piksel w obrazie zródłowym jest czarny 31 { 32 if (rand == 0) //wylosowana liczba jest 0 33 { 34 b1.setpixel(i, j, Color.Black); //w obrazie 1 i na czarny 35 b1.setpixel(i + 1, j, Color.White); //w obrazie 1 i+1 na biały 36 b2.setpixel(i, j, Color.White); //w obrazie 2 i na biały 37 b2.setpixel(i + 1, j, Color.Black); //w obrazie 2 i+1 na czarny 38 } 39 else 40 { 41 b1.setpixel(i, j, Color.White); //w obrazie 1 i na biały 42 b1.setpixel(i + 1, j, Color.Black); //w obrazie 1 i+1 na czarny 43 b2.setpixel(i, j, Color.Black); //w obrazie 2 i na czarny 44 b2.setpixel(i + 1, j, Color.White); //w obrazie 2 i+1 na biały 45 } 46 } 47 } 48 this.form.invoke(form.prg, new Object[] { ((int)(((double)i / (double)(b1.width - 1)) * 100)) }); 49 } 50 this.form.invoke(this.form.endgeneratebitmap, new Object[] { pb1, b1 }); 51 this.form.invoke(this.form.endgeneratebitmap, new Object[] { pb2, b2 }); 52 this.form.invoke(this.form.endth); 53 } W pierwszej kolejności tworzone są dwie puste bitmapy o wysokości takiej jak wejściowa bitmapa oraz szerokości bitmapy wejściowej która została zaokrąglona do parzystości. Następnie tworzony jest obiekt klasy random który będzie służył do losowania 1 lub 0. Ponieważ aplikacja została napisana jako wielowątkowa w następnym kroku informujemy nasz wątek w którym uruchomiana jest aplikacja o rozpoczęciu procesu tworzenia obrazów. W pętlach przechodzimy pożytych pikselach na szerokość obrazu oraz po każdym pikselu na wysokość bitmapy. Jeśli wybrany piksel z obrazu wejściowego ma kolor biały wtedy sprawdzamy która liczba została wylosowana. Jeśli wylosowana liczba to 0 ustawione są piksele czarny i biały w obu obrazach, w przeciwnym wypadku ustawiane są piksele biały i czarny. Jeśli natomiast wybrany piksel w obrazie źródłowym ma inny kolor(czarny) następuje ustawienie piksele w zależności od wylosowanej liczby czarny biały(obraz pierwszy), biały czarny(obraz drugi) lub jeśli zostaje wylosowana jedynka biały czarny(obraz pierwszy),czarny biały(obraz drugi). W czasie działania pętli przy każdym przejściu pętli szerokości następuje przesłanie stanu do wątku głównego. Po zakończeniu algorytmu przesyłamy do wątku głównego dwie wynikowe bitmapy oraz informacje o zakończeniu algorytmu. 1 public void ovarlayimage() 2 { 3 this.form.invoke(this.form.startth, null); 4 for (int i = 0; i < b.width; i++) 5 {

6 for (int j = 0; j < b.height; j++) //dla kaŝdego piksela w obrazie 1 7 { 8 if (b.getpixel(i, j) == Color.FromArgb(255, 255, 255, 255)) //sprawdzamy czy kolor aktualnego piksela jest biały 9 { 10 b.setpixel(i, j, b2.getpixel(i, j)); //jeśli tak w jego miejsce wstawiamy piksel z obrazu drugiego 11 } 12 } 13 this.form.invoke(form.prg, new Object[] { ((int)(((double)i / (double)(b.width - 1)) * 100)) }); 14 } 15 this.form.invoke(this.form.endgeneratebitmap, new Object[] { pb, b }); 16 this.form.invoke(this.form.endth); 17 } Dekodowanie obrazu polega na wstawieniu w miejsca białych pikseli w obrazie pierwszym czarnych obrazów z obrazu drugiego. Jednak w celu przyspieszenia w powyższym algorytmie sprawdzamy jedynie czy wybrany piksel jest biały i jeśli tak jest w jego miejsce wstawiany jest piksel z obrazu drugiego. Kod rozpoczyna się od poinformowania wątku głównego o rozpoczęciu, następnie dla każdego piksela wykonywany jest algorytm. Dla każdego piksela na wysokość zostaje obliczony procent postępu. Po zakończeniu algorytmu wykonywana jest metoda endgeneratebitmap która to wyświetla w odpowiednim PictureBox-ie wynikową bitmapę. 1 public void clear() 2 { 3 this.form.invoke(this.form.startth, null); 4 if (b!= null) 5 { 6 Bitmap bw = new Bitmap(b.Width + (b.width % 2), b.height); //wynikowa bitmapa zaokrąglaona do szerokości parzystaj 7 for (int i = 0; i < b.width; i += 2) //tylko parzyste piksele szerokości 8 { 9 for (int j = 0; j < b.height; j++) //wszystkie piksele wysokości 10 { 11 //jeśli wybrany piksel oraz piksel i+1 są czarne w obrazie wynikowym pozostają one czarne 12 if ((b.getpixel(i, j) == Color.FromArgb(255, 0, 0, 0)) && (b.getpixel(i + 1, j) == Color.FromArgb(255, 0, 0, 0))) 13 { 14 bw.setpixel(i, j, Color.FromArgb(255, 0, 0, 0)); 15 bw.setpixel(i + 1, j, Color.FromArgb(255, 0, 0, 0)); 16 } 17 else 18 { 19 //w przeciwnym wypadku zmieniamy ich kolor na biały 20 bw.setpixel(i, j, Color.FromArgb(255, 255, 255, 255)); 21 bw.setpixel(i + 1, j, Color.FromArgb(255, 255, 255, 255)); 22 } 23 } 24 this.form.invoke(form.prg, new Object[] { (int)(((double)i / (double)(b.width - 1)) * 100) }); 25 } 26 this.form.invoke(this.form.endgeneratebitmap, new Object[] { p, bw }); 27 } 28 this.form.invoke(form.endth, null); 29 } Metoda służy do usunięcia zbędnych czarnych pikseli znajdujących się w bitmapie wynikowej. Jeśli piksel parzysty oraz nieparzysty mają kolor czarny oznacza to że należy pozostawić je czarne, w przeciwnym wypadku w bitmapie wynikowej zmieniamy ich kolor na biały.

1 public void makebw() 2 { 3 this.form.invoke(this.form.startth, null); 4 if (b!= null) //sprawdzamy czy mamy jakąs bitmape w b 5 { 6 for (int i = 0; i < b.width; i++) //dla wszystkich pikseli w obrazie 7 { 8 for (int j = 0; j < b.height; j++) 9 { 10 if ((b.getpixel(i, j).r > f) (b.getpixel(i, j).g > f) (b.getpixel(i, j).b > f)) //sprawdzamy czy piksel ma którąkolwiek składową większą od f 11 { 12 b.setpixel(i, j, Color.White); //jeśli tak wynikowy kolor ustawiamy na biały 13 } 14 else 15 { 16 b.setpixel(i, j, Color.Black); //w przeciwnym wypadku ustawiony zostaje na czarny 17 } 18 } 19 this.form.invoke(form.prg, new Object[] { (int)(((double)i / (double)(b.width - 1)) * 100) }); 20 } 21 this.form.invoke(this.form.endgeneratebitmap, new Object[] { p, b }); 22 } 23 this.form.invoke(form.endth, null); 24 } Metoda służy do zamieniania obrazów kolorowych na obrazy monochromatyczne. Algorytm działania polega na sprawdzeniu czy którykolwiek ze składowych jest większy od wybranej przez użytkownika wartości f. Jeśli tak w obrazie wyjściowym ustawiany jest piksel o kolorze białym w przeciwnym wypadku ustawiamy kolor czarny. Następnie po zakończeniu algorytmu wyświetlamy wynikową bitmapę w odpowiednim PictureBox-ie. 5. Testowanie oprogramowania Testowanie programu jest utrudnione, ponieważ algorytm wykorzystuje czynnik losowy, dlatego otrzymywane wyniki nigdy nie są takie same. Testowanie rozpoczynamy od sprawdzenia poprawności przekształcenia obrazu kolorowego na obraz monochromatyczny, w tym celu klikamy na przekształć obraz, a następnie wybieramy klikamy otwórz.

Bitmapa wejściowa Bitmapa wyjściowa Powyższy obrazek został poprawnie przekształcony. Następnie sprawdzamy poprawność algorytmu kryptografii wizualnej generującego dwie bitmapy wynikowe. Zostały one przedstawione poniżej. Pierwsza bitmapa wynikowa Druga bitmapa wynikowa Niestety z powyższych obrazów trudno cokolwiek odczytać. Jednak po ich nałożeniu na siebie otrzymujemy następujący obraz:

Obraz po nałożeniu Obraz po wyczyszczeniu zbędnych czarnych pikseli 6. Wnioski Algorytm wizualnej kryptografii nie okazał się trudny w implementacji, dlatego postanowiłem nieco rozbudować moją aplikację między innymi o możliwość przekształcania obrazów kolorowych na obrazy monochromatyczne, które są w nim wymagane. Dodatkowo aplikacja została rozwinięta o możliwość czyszczenia bitmap wyjściowych ze zbędnych czarnych pikseli. Z uwagi jednak na fakt, że algorytm bierze pod uwagę jedynie piksele parzyste aby zachować rozmiar obrazu wejściowego z wyjściowym obraz oryginalny różni się od obrazu wyjściowego. Założenie dla którego algorytm został utworzony zostaje zachowane, a mianowicie nie posiadając obu obrazów wynikowych nie powinno dać się odczytać zaszyfrowanej wiadomości, a po ich połączeniu zakodowana informacja powinna być czytelna.