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

Praca inżynierska - poziom trudności - porada odnośnie tematu
tburton12
  • Rejestracja:około 6 lat
  • Ostatnio:prawie 6 lat
  • Postów:5
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

TE
  • Rejestracja:ponad 7 lat
  • Ostatnio:31 minut
  • Postów:268
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.

edytowany 1x, ostatnio: Terrored
mr_jaro
hehehehe ja pisałem kod 2 miesiące a tekst tydzień :p
DR
Głównym celem pracy inżynierskiej nie jest niestety napisanie programu a napisanie na kilkadziesiąt stron pracy. Chyba na Wyższej szkole gotowania ryżem. Mylisz inz. z magistrem.
WeiXiao
  • Rejestracja:około 9 lat
  • Ostatnio:mniej niż minuta
  • Postów:5109
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?

edytowany 1x, ostatnio: WeiXiao
Hispano-Suiza
  • Rejestracja:ponad 8 lat
  • Ostatnio:ponad 5 lat
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 :-)


"Trolling is a art"
Zobacz pozostałe 5 komentarzy
Hispano-Suiza
hahah no i ja koniec końców też brałem pozycje .NETowe. Zabawne bo mogłem wszystko jedną książką opisać ale wymóg był ileś pozycji PL i EN. Więc musiałem szukać książek na siłę i brać techniczne rzeczy.
mr_jaro
@Hispano-Suiza: tia... minimum 30% po angielsku i minimum 15 pozycji. Wymyślanie na siłę.
Hispano-Suiza
@lambdadziara: Najpierw miałem pisać cały wielki system do ticketów (teatry, kina etc.). Zajarany jakimś amerykańskim startupem* Ale jak ogarnąłem skalę projektu i brak sensownej bibliografii to było już późno. I na szybko wziąłem sklep w .NET bo takowy temat został. A koniec końców i tak bibliografię podciągnąłem pod techniczne wiec mogłem zostać przy poprzednim projekcie - którego bym nie dźwignął na taka skalę jak planowałem :P
mr_jaro
@lambdadziara: portal do komunikacji z ludźmi ze swiata przeznaczony pod naukę języków obcych, aczkolwiek to była tylko obudowa pod komunikacje audio-wideo po webrtc, która napisałem bez żadnych bibliotek w tym skonfigurowanie wszystkich potrzebnych serwerów p2p itp
tburton12
  • Rejestracja:około 6 lat
  • Ostatnio:prawie 6 lat
  • Postów:5
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ą.

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
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:

Kopiuj
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.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom
WeiXiao
Dlaczego właściwie tyle osób decyduje się na wizualizacje grafów oraz paradygmat agentowy?
Shalom
Sporo z tych tematów to "propozycje", czyli prowadzący robi z tego akurat jakieś badania i wrzuca tematy które by mu sie przydały.
Hispano-Suiza
  • Rejestracja:ponad 8 lat
  • Ostatnio:ponad 5 lat
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.


"Trolling is a art"
superdurszlak
  • Rejestracja:prawie 7 lat
  • Ostatnio:około 23 godziny
  • Lokalizacja:Kraków
  • Postów:1999
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ż. ;)


lambdadziara
superduszlak, ktory robią szyfrowanie plików jako jeden z miniprogramów na elitarnym kierunku AGH to wlasnie jedna z osob, z jakimi muszą konkurować ci, którzy chcą sie załapać na staż w krk :) Ech, ostatnimi czasy jakos nie mam ochoty na nic, jestem jakaś przemęczona
superdurszlak
bez przesady, w czwarty staż się nie dam wkopać xD edit a co do tej domniemanej elitarności mojego kierunku, to szkoda, że nikt na AGH nie zdaje sobie sprawy, że jesteśmy elitą :P nawet sam o tym nie wiedziałem
lambdadziara
wszystkie 4 staze programistyczne? :D
superdurszlak
wszystkie 3, nawet ostatni matoł dostaje w końcu normalne stanowisko
B2
  • Rejestracja:około 6 lat
  • Ostatnio:prawie 5 lat
  • Postów:59
0

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

Spine
  • Rejestracja:prawie 22 lata
  • Ostatnio:28 minut
  • Postów:6634
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


🕹️⌨️🖥️🖱️🎮
edytowany 1x, ostatnio: Spine
IK
ci co się dziwią to chyba w innym kraju studiowali
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)