Praca inżynierska - poziom trudności - porada odnośnie tematu

0

Cześć wszystkim :)
Stoję przed wyborem tematu pracy inżynierskiej. Przyszedł mi do głowy pewien pomysł, który chciałbym zrealizować. Problem jest taki, że nie jestem zorientowany jakiego poziomu trudności praca powinna być.

Chciałbym napisać program w Pythonie umożliwiający zaszyfrowanie tekstu/pliku (nie wybrałem jeszcze metody, być może RSA, zapewne przy użyciu biblioteki) a następnie osadzenie go w wybranym obrazie przy użyciu metody najmniej znaczących bitów. Do tego oczywiście proces wsteczny, tj. możliwość odczytywania zaszyfrowanej wiadomości. Całość programu w formie okienkowej, z graficznym interfejsem.

Temat wydaje mi się ciekawy, ale mimo wszystko w Pythonie raczej nie byłby zbyt obszerny w kodzie. Obawiam się że może być zbyt prosty jak na pracę inżynierską.

Co o tym myślicie?
Jeśli macie jakieś ciekawe pomysły na ewentualne rozszerzenie tej pracy, ewentualnie jakieś sugestie to chętnie ich wysłucham :)

Pozdrawiam

0

Mi się pomysł podoba. Kod nie ma być obszerny. Głównym celem pracy inżynierskiej nie jest niestety napisanie programu a napisanie na kilkadziesiąt stron pracy. Jeśli zagłębisz się w ocenę takiej pracy to program, projekt jest małym procentem całkowitej oceny. Ja wyszedłem z założenia zrobienia jak najprostszej pracy by mieć spokój i czas na bardziej interesujące rzeczy.

0

Brzmi ciekawie, więc aż zapytam

Ile tego tekstu maksymalnie może wejść do obrazka np. 100x100?

A gdyby wiadomość rozbić na każdy frame gifa?

0

To co chcesz zrobić nazywa się steganografią. Napisanie takiej pracy to jest zajęcie na chwilę (program). Zrobienie z tego odpowiedniej ilości tekstu to już większy problem. Nie wiem jak dziś ale jak ja pisałem to musiałem mieć pokrycie w pozycjach (bibliografia) z których musiałem czerpać jakieś skrawki do swojej pracy.

Temat jest względnie jednym z łatwiejszych do napisania więc można śmiało brać - jeżeli masz inne (ciekawsze) rzeczy na głowie. Jeżeli nie masz to możesz być bardziej ambitny jeżeli lubisz/chcesz lub leniwy :-)

0
Terrored napisał(a):

Mi się pomysł podoba. Kod nie ma być obszerny. Głównym celem pracy inżynierskiej nie jest niestety napisanie programu a napisanie na kilkadziesiąt stron pracy. Jeśli zagłębisz się w ocenę takiej pracy to program, projekt jest małym procentem całkowitej oceny. Ja wyszedłem z założenia zrobienia jak najprostszej pracy by mieć spokój i czas na bardziej interesujące rzeczy.

Dzięki za opinię :)

WeiXiao napisał(a):

Brzmi ciekawie, więc aż zapytam

Ile tego tekstu maksymalnie może wejść do obrazka np. 100x100?

A gdyby wiadomość rozbić na każdy frame gifa?

Z wiedzą jaką dysponuję na ten moment, około 3500 znaków w ascii jeśli z każdego z kanałów RGB zabierzemy po jednym bicie.
Gif to bardzo dobry pomysł. Rozważę dodanie go do projektu :)

Hispano-Suiza napisał(a):

To co chcesz zrobić nazywa się steganografią. Napisanie takiej pracy to jest zajęcie na chwilę (program). Zrobienie z tego odpowiedniej ilości tekstu to już większy problem. Nie wiem jak dziś ale jak ja pisałem to musiałem mieć pokrycie w pozycjach (bibliografia) z których musiałem czerpać jakieś skrawki do swojej pracy.

Temat jest względnie jednym z łatwiejszych do napisania więc można śmiało brać - jeżeli masz inne (ciekawsze) rzeczy na głowie. Jeżeli nie masz to możesz być bardziej ambitny jeżeli lubisz/chcesz lub leniwy :-)

Biorąc pod uwagę, że do oddania pracy mamy rok, chętnie rozszerzyłbym pracę o jakiś ciekawy dodatek. Póki co, jestem w o tyle komfortowej sytuacji, że pomysł który mam będę realizował z przyjemnością.

2

Nie no bez żartów? Przecież ten "projekt" to jest pół godziny roboty i można by się zamknąć w 30 linijkach pythona jeśli olejemy GUI. Na wyższej szkole gotowania na gazie może przejdzie...
Popatrz sobie może np. na https://www.ki.agh.edu.pl/theses-both-5/all

edit:

import gmpy2

from Crypto.Random import random
from Crypto.Util.number import bytes_to_long, long_to_bytes
from PIL import Image


def encrypt(data, modulus, picture_path, output_path):
    enc = pow(bytes_to_long(data), 65537, modulus)
    bits = bin(enc)[2:]
    im = Image.open(picture_path)
    pixels = im.load()
    width = im.size[0]
    height = im.size[1]
    new = Image.new("RGB", (width, height))
    start_index = width * height - len(bits)
    data_index = 0
    for i in range(width):
        for j in range(height):
            color = pixels[i, j]
            if i * height + j >= start_index:
                new_color = (color[2] & 0b11111110) | int(bits[data_index])
                data_index += 1
            else:
                new_color = color[2] & 0b11111110
            new.putpixel((i, j), (color[0], color[1], new_color))
    new.save(output_path)


def decrypt(p, q, picture_path):
    im = Image.open(picture_path)
    pixels = im.load()
    width = im.size[0]
    height = im.size[1]
    bits = []
    for i in range(width):
        for j in range(height):
            color = pixels[i, j]
            bit = color[2] & 1
            bits.append(bit)
    payload = int("".join(map(str, bits)), 2)
    decrypted = pow(payload, gmpy2.invert(65537, (p - 1) * (q - 1)), p * q)
    return long_to_bytes(decrypted)


def gen_prime():
    return gmpy2.next_prime(random.randint(2 ** 511, 2 ** 512))


def main():
    p, q = gen_prime(), gen_prime()
    data = 'ala ma kota a sierotka ma rysia'
    out_path = "encrypted.png"
    encrypt(data, p * q, "input.png", out_path)
    print(decrypt(p, q, out_path))


main()

GUI nie ma, ale robi dokładnie to co opisałeś ->

  • Szyfruje RSA podane dane przy użyciu podanego klucza i umieszcza jako LSB jednego z kolorów
  • Deszyfruje dane z podanego pliku przy użyciu podanego klucza

Wyszły 33 linijki, nie licząc importów i funkcji które pokazują jak to działa.

0

Biorąc pod uwagę, że do oddania pracy mamy rok, chętnie rozszerzyłbym pracę o jakiś ciekawy dodatek. Póki co, jestem w o tyle komfortowej sytuacji, że pomysł który mam będę realizował z przyjemnością.

Tylko tutaj nie ma co rozszerzać. U mnie gość wziął sobie ten temat. Pisałem mu ten projekt w C# i wtedy zajęło mi to jakieś 2h. A on przez pół roku ledwo wyrzeźbił z tego 30 kartek A4. Oczywiście możesz sobie robić jaja z pracy inżynierskiej :-) ale bądźmy jednak poważni i traktujmy tytuł inżyniera z należytym szacunkiem :P

Masz fajny zbiór powyżej na linku od @Shalom ja dorzucę od siebie jeszcze:
http://www.kt.agh.edu.pl/~niemiec/prace-in-ynierskie.html

A jak sam zrobisz research to pewnie znajdziesz coś ciekawego.

0

Chyba już dość zostało powiedziane na temat tego tematu - od siebie dodam, że projekty o takim stopniu złożoności owszem, robiliśmy - tylko że jako "mini-projekty" realizowane w cyklu tygodniowym czy tam dwutygodniowym na jakiś jeden przedmiot za może 4ECTS ;) przygotowanie pracy inżynierskiej powinno zabrać - zależnie od syllabusa - ok 15ECTS...

Jeśli już chcesz robić coś w stylu tego, co zaproponowałeś - może spróbuj złożyć algorytm, który będzie próbował odzyskiwać klucze np AES zaszyte w LSB bitmapy, która została następnie poddana kompresji stratnej np JPEG.

Tutaj byłoby już dużo szersze pole do popisu - musiałbyś jakoś określić, które z bitów faktycznie pochodziły z oryginalnego klucza, a które są wynikiem działania kompresji - być może nie będzie się dało określić tego zero-jedynkowo, ale z jakimś prawdopodobieństwem - ale każde p != 0.5 będzie przydatne do usprawnienia łamania klucza ;] poza tym nawet jak już ustalisz możliwe stany niektórych bitów, będziesz musiał ustalić pozostałe - i tutaj też możesz przetestować różne warianty (od najbardziej prymitywnego BF, przez choćby jakieś BF wykorzystujące np wspomniane prawdopodobieństwa czy własności klucza etc) i nie braknie Ci contentu do opisania w pracy inż. ;)

0

Nie jestem programistą ale nie używaj bibliotek tylko napisz wszystko z palca to będzie trudniej i będzie co opisywać.

0

Kumpel obronił inżynierkę generatorem liczb losowych... używającym rand, w C.
Oprócz opisu, miał w dokumencie kilka stron liczb losowych wygenerowanych przez program :D

1 użytkowników online, w tym zalogowanych: 0, gości: 1