W jaki sposób odzyskać zmodyfikowany obraz?

W jaki sposób odzyskać zmodyfikowany obraz?

Wątek przeniesiony 2020-11-13 15:33 z C# i .NET przez cerrato.

KO
  • Rejestracja:prawie 7 lat
  • Ostatnio:21 dni
  • Postów:125
0

Cześć!

Zastanawiam się czy istnieje metoda, dzięki której można przywrócić zmodyfikowany obraz do pierwotnego stanu? Moje pytanie związane jest z programem stenograficznym, który aktualnie szyfruje i deszyfruje dane z wybranego obrazu, lecz nurtuje mnie pewna kwestia jak zabezpieczyć się przed modyfikacją obrazu który posiada zaszyfrowane dane, tak żeby nie utracić zaszyfrowanych danych. Przykładowo, otrzymuję zaszyfrowany obraz, wysyłam go komuś, on na nim coś narysuje w paincie, i w tym momencie obraz traci dane. Czy jest jakiś algorytm który przed deszyfracją by sprawdzał obraz pod względem modyfikacji i je cofał? Albo może zrobić zabezpieczenie tylko w postaci sprawdzania sumy kontrolnej przed deszyfrowaniem, dowiadując się w ten sposób czy obraz nie jest uszkodzony? Za wszelkie pomysły będę bardzo wdzięczny. Aplikacja pisana jest z wykorzystaniem technologii C# i WPF.

cerrato
Moderator Kariera
  • Rejestracja:około 7 lat
  • Ostatnio:5 minut
  • Lokalizacja:Poznań
  • Postów:8761
5

Nie sądzę. Dałoby się to zrobić, ale musiałby takie działania wspierać sam edytor grafik/program graficzny.
Ciężko oczekiwać od zwykłego programu do grezbania w grafice (jakiś Paint, GIMP czy Photoshop), żeby podczas otwierania sprawdzał, czy ten plik nie zawiera jakichś zaszyfrowanych danych. Zwłaszcza, że sposobów zapisania ukrytych treści w obrazie może być praktycznie nieskończona ilość.

O ile plik z grafiką nie jest w jakiś sposób uszkodzony, to program graficzny go zaczyta, potem pozwoli dokonać modyfikacji i jeśli zmienione obszary obrazka będą się pokrywać z tymi, w których jest zakodowana wiadomość, to zostaną nadpisane. Ponadto jest szansa, że nawet jeśli tamtych rejonów nie tkniesz, to i tak podczas zapisu obrazka zostanie przeprowadzona kompresja całości, przez co utracisz swój szyfr.

Dla bezpieczeństwa przyjmij, że jakiekolwiek tajne wiadomości osadzone w pliku graficznym, po jego edycji i/lub zapisie z poziomu programu graficznego zostaną utracone.


KO
  • Rejestracja:prawie 7 lat
  • Ostatnio:21 dni
  • Postów:125
0

Dziękuję za szybką odpowiedź. Czyli raczej marne szanse na znalezienie algorytmu w c# który by korygował jakkolwiek wprowadzone zmiany w obrazie? Szczerze mówiąc właśnie to mnie nurtowało, ponieważ tak się zastanawiałem czy można jakkolwiek zabezpieczyć się przed utratą danych z tego obrazu, ewentualnie jakby doszło do tej utraty, czy można jakoś je przywrócić, ale widzę szanse marne.
A myśląc w inną stronę, jakbym nie chciał odzyskiwać zmodyfikowanego obrazu do postaci pierwotnej, może istnieje możliwość, żeby tworzony obraz, był tylko do odczytu, usunąć mu możliwość modyfikacji, a także dodać w jakiś sposób do metadanych sumę kontrolną, którą by program sprawdzał przed rozpoczęciem deszyfrowania? Bo jeżeli dobrze myślę suma kontrolna mienia się zawsze z każdą modyfikacją?
Chyba ze istnieje jakiś inny sposób, sprawdzenia poprawności pliku, czy był modyfikowany bądź nie, z wykorzystaniem c#, chętnie je poznam.

edytowany 1x, ostatnio: Krispi One
cerrato
Moderator Kariera
  • Rejestracja:około 7 lat
  • Ostatnio:5 minut
  • Lokalizacja:Poznań
  • Postów:8761
4

znalezienie algorytmu w c#

Język czy technologia nie ma tutaj żadnego znaczenia.

korygował jakkolwiek wprowadzone zmiany w obrazie

Jak pisałem - kiepsko to widzę. Takie zmiany w obrazie mogą powstać przynajmniej w 2 sytuacjach:

  • zmiany podczas zapisu, wynikające z kompresji stratnej. Zauważ, że większość formatów graficznych (np. JPG) to jest kompresja stratna. W zamian za utratę części jakości i informacji zawartych w pliku, zyskujesz o wiele mniejszy rozmiar. Możesz zrobić eksperyment - zrób jakiś plik BMP, potem zapisz go jako PNG, a następnie przekonwertuj ponownie na BMP. Obrazy pierwsze i ostatnie będą się od siebie różnić. Tutaj jeszcze można by było spróbować odzyskać zaszyfrowane treści, ale kiepsko to widzę
  • ktoś coś narysował w miejscu, w którym była zaszyfrowana wiadomość. Pierwotna treść zostaje nadpisana, nie ma szans na odzyskanie.

żeby tworzony obraz, był tylko do odczytu

Nie kojarzę plików graficznych, które posiadają taką opcję. Zwłaszcza ta uwaga dotyczy tych bardziej popularnych - typu JPG. Można takie zabezpieczenia dawać np. do PDF, ale to już nie jest plik graficzny.


edytowany 1x, ostatnio: cerrato
Freja Draco
Freja Draco
  • Rejestracja:prawie 7 lat
  • Ostatnio:ponad 3 lata
  • Postów:3394
3

Jedyne rozwiązanie jakie widzę, to kodowanie danych w obrazie w sposób redundantny, tak, żeby ewentualne modyfikacje zniszczyły tylko jedną z kopii danych.


hauleth
Nie zabezpieczy to w 100%, ale zawsze to lepsze niż nic.
KO
  • Rejestracja:prawie 7 lat
  • Ostatnio:21 dni
  • Postów:125
0

@cerrato: dziękuję bardzo za odpowiedź, w takim wypadku nie zostaje mi nic, jak zabezpieczyć się przed ewentualną utratą danych w postaci jakiegoś komunikatu, bo plików pewnie raczej nie dam rady modyfikować i odzyskiwać. Z kwestii technicznych, to plikiem wynikowym zaszyfrowanym, zawsze jest plik PNG, aczkolwiek pewnie to wiele nie zmienia odnośnie odzyskiwania danych.

@Freja Draco ciekawa propozycja, a tak z ciekawości jakbym mógł użyć takiej metody w algorytmie LSB, zapisać każdy bit wiadomości podwójnie obok siebie, czy raczej zapisać wszystkie informacje wiadomości, a później zapisać je ponownie? Bo jeżeli dobrze rozumiem redundancja to nadmiarowość, czyli bym musiał powielić informacje podczas szyfrowania.

Jeszcze mam takie jedno pytanie, może znacie na nie odpowiedź, jest możliwość utworzenia z pliku BMP, lub PNG, pliku PDF, z którego później bym mógł otrzymać nieskompresowany plik graficzny?

edytowany 1x, ostatnio: Krispi One
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)