Jak zaszyfrować Zapisz pliki bez użycia klucza? [Zamknięte]

21

Powiedzmy, że stworzyłem prosty program, który pobiera plik .datzaszyfrowany w formacie binarnym , następnie odszyfrowuję go do tablicy bajtów, a następnie wszystko jest ponownie zapisywane w pliku odszyfrowanym.

Na przykład:

Stworzyłem algorytm szyfrowania binarnego. => 0100100001100101001000000110100001100101011000 ...

Ale bardzo łatwo to odszyfrować ...

Czy jest jakiś sposób, że jeśli to możliwe, nie potrzebuje żadnego klucza, aby zaszyfrować mój postęp zapisu?

Daniel Béjar
źródło
15
Czy na pewno chcesz szyfrować zapisy? Są łatwiejsze sposoby oszukiwania, na przykład podczas modyfikacji pamięci. Po prostu skompresowałbym je za pomocą Zlib (wstawiłem do .gz), zmniejszyłoby to rozmiar i uniemożliwiłoby niektórym potencjalnym oszustom jego modyfikację.
HolyBlackCat
36
Nitpicking: To, co robisz, to kodowanie , a nie szyfrowanie .
Philipp
13
(zakładając, że dotyczy to jednego gracza) Nie próbuj zapobiegać oszustwom w grze dla jednego gracza, to jest denerwujące zarówno dla ciebie, jak i dla gracza. I ostatecznie jest bezużyteczny.
6
Nie można zaszyfrować zapisanych plików, aby użytkownik nie mógł ich odczytać ani zmodyfikować. (Ponieważ na przykład mogą po prostu zatrzymać grę w debuggerze zaraz po odszyfrowaniu!). Możesz jednak to utrudnić (ponieważ otwarcie zwykłego pliku tekstowego jest naprawdę łatwe w porównaniu do znalezienia odpowiedniego momentu, aby zatrzymać grę w debuggerze). Czy to właśnie próbujesz zrobić?
user253751
6
@DanielBejar Właśnie ci powiedziałem, że nie możesz tego uniemożliwić, możesz tylko utrudnić.
user253751

Odpowiedzi:

77

Ogólnie rzecz biorąc, nigdy nie powinieneś wymyślać własnych algorytmów kryptograficznych, chyba że masz co najmniej doktorat z matematyki i informatyki. Istnieje jednak wiele dobrych algorytmów bazowych, które nie mają znanych ataków i mają bezpłatne implementacje w wielu językach programowania. Na przykład RC5, AES lub Blowfish. W zależności od technologii, której używasz do tworzenia gry, może ona nawet oferować bezpieczne szyfrowanie od razu po wyjęciu z pudełka.

Pytanie brzmi jednak, czy szyfrowanie zapisanych gier jest dobrym pomysłem.

Po pierwsze, gdy masz plik wykonywalny gry do szyfrowania i deszyfrowania, musisz dołączyć zarówno algorytm i klucz do pliku wykonywalnego gry. Oznacza to, że zdeterminowany haker może je znaleźć, wyodrębnić i wykorzystać do zbudowania edytora gier. Dlatego nigdy nie może być w 100% bezpieczny.

Po drugie, dlaczego i tak chcesz to zrobić? Gdy jest to gra online, należy przechowywać gamestate online, gdzie gracze nie mogą go modyfikować. Jeśli jest to gra offline, to po co? Oszust może w najgorszym wypadku zaszkodzić własnej grze. Nie będzie to miało wpływu na uczciwych graczy, którzy chcą cieszyć się grą zgodnie z przeznaczeniem. Z drugiej strony, pozwalanie graczom na oszukiwanie może zwiększyć wartość twojej gry. Pozwala graczom doświadczyć gry w inny sposób, co może po prostu zwiększyć ich długoterminową przyjemność z gry.

Philipp
źródło
5
Chociaż nie wyobrażam sobie, żeby ktoś wymyślił coś dobrego za kilka godzin. I marnowałbyś zasoby na coś, czego prawdopodobnie nie potrzebujesz.
Aistis
6
„Jeśli jest to gra offline, po co zawracać sobie głowę?” Co jeśli jest to gra dla jednego gracza z najlepszymi wynikami online?
Facet z kapeluszem
19
„pozwalanie graczom na oszukiwanie może zwiększyć wartość twojej gry” - głosowano za tym stwierdzeniem. Naprawdę denerwują mnie gry, które decydują się zablokować części doświadczenia, za które zapłaciłem, dopóki nie osiągnę pewnego poziomu mistrzostwa i cieszę się, że w takich przypadkach dostępne są kody umożliwiające odblokowanie pełnej gry. Na przykład jestem całkowicie zagubiony w turniejach wyścigowych przeciwko AI w starszych częściach Need for Speed ; dla mnie przyjemność polegała raczej na jeździe przez różnorodne krajobrazy, dlatego zwykle pomijam wyścigi i odblokowuję wszystkie mapy i samochody. Gra, która temu zapobiega, po prostu mnie drażni.
LUB Mapper
6
Chciałbym „chyba, że ​​masz co najmniej doktorat z matematyki i informatyki” przepisany jako „chyba, że ​​masz co najmniej wiedzę niezbędną do uzyskania stopnia doktora zarówno z matematyki, jak i informatyki” (a nawet wtedy przynajmniej w Niemczech kursy są często pełne rzeczy niezwiązanych z kryptografią). Nie trzeba z natury stopnia, by przewyższyć doktoraty.
fresnel
5
@phresnel Podczas gdy masz techniczną rację, doktorat jest standardową miarą opanowania przedmiotu teoretycznego, przyznawaną przez zaufane instytucje. Dlatego warto używać go jako skróconej wiedzy i umiejętności potrzebnych do uzyskania doktoratu. Innymi słowy: to, co oznaczało OP, jest wystarczająco jasne :-)
Tobia
10

Aby zaszyfrować i odszyfrować lokalnie, będziesz musiał przechowywać klucz w swoim programie, aby ludzie mogli złamać szyfrowanie, jeśli rozłożą twój kod. Istnieją sztuczki, aby zaciemnić klucze, ale nawet w przypadku tych oddanych atakujący znajdzie klucz, a następnie opublikuje go online dla wszystkich, którzy są mniej oddani do zobaczenia. Jedyne, co uniemożliwia szyfrowanie, to osoby korzystające z edytora szesnastkowego - można to łatwo skompresować za pomocą kompresji i wszystkiego, co czyni plik nieczytelnym przez program do rozpakowywania. Np. Dodaj jeden bajt przed danymi.

Alternatywnie możesz dołączyć md5 pliku zapisu na końcu pliku, abyś zauważył, że plik został sfałszowany. Następnie możesz użyć tego do odmowy załadowania zapisanej gry lub do odpowiedniego zgłoszenia zgłoszeń do pomocy technicznej, abyś nie tracił czasu na problemy spowodowane ręcznie modyfikowanymi zapisami. Znów jest to łatwe do obejścia przez każdego, kto potrafi odczytać twój kod.

Jeśli chcesz czegoś, czego nie może obejść ktoś, kto ma dostęp do plików binarnych na swoim urządzeniu, musisz uruchomić część programu na serwerze, który jest pod twoją kontrolą.

Aby odpowiedzieć na twoje ostatnie pytanie, klucz plus typ szyfrowania po prostu określa dokładny algorytm, który należy zastosować do szyfrowania / deszyfrowania. Nie można szyfrować / deszyfrować danych bez algorytmu, który określa, jak to zrobić.

Peter - Unban Robert Harvey
źródło
Twój drugi punkt jest miły. Może to również pomóc w śledzeniu problemów w przypadku uszkodzenia pliku.
Knowledge_is_power
4

Przechowuj transformowany skrót SHA256 rzeczywistych danych zapisu w pliku zapisu.

Porównaj przechowywany skrót z wartością SHA256 danych podczas ładowania.

Jeśli to nie pasuje, oszukiwali lub uszkadzali plik.

Edycja wyjaśnienie: to sprawia, że trudniej złamać Anti-Cheat system, ale nadal możliwe .

Lolums
źródło
7
Nic nie powstrzymuje ludzi przed ponownym obliczeniem skrótu po dokonaniu modyfikacji. Nie rozumiem też, dlaczego wciąż istnieją ludzie, którzy opowiadają się za złamanym algorytmem MD5 ze wszystkimi znanymi słabościami kryptograficznymi, skoro istnieją o wiele lepsze alternatywy, takie jak SHA-256 (dla podpisów) lub bcrypt (dla haseł).
Philipp
1
Prosty, szybki i całkowicie zepsuty.
DeadMG
2
@DeadMG Jest zepsuty przez projekt, ponieważ użytkownik ma dostęp do plików binarnych, które muszą zawierać klucz. Używanie silniejszego skrótu lub szyfrowanie pliku za pomocą czegoś takiego jak AES byłoby marnotrawstwem zasobów i złym projektem, ponieważ nie zapewnia dodatkowego bezpieczeństwa , ale zwiększa koszty. +1, ponieważ opinia negatywna jest niezasłużona.
Peter - Unban Robert Harvey
7
@Philipp, ponieważ w tym przypadku MD5 jest wyraźnie lepszy od SHA-256. Opisane podejście wymaga taniego algorytmu sumy kontrolnej, czyli dokładnie tego, czym jest MD5.
Peter - Unban Robert Harvey
3
@ transistor09, jeśli jest to wyłącznie strona klienta, nie możemy nic zapewnić , a suma kontrolna działa tak samo dobrze, jak klient szyfruje całość. Tak czy inaczej, można go złamać.
Lolums
1

Użyłbym standardowego algorytmu szyfrowania (ponieważ utrudnia to przeprowadzenie analizy kryptograficznej zapisanego pliku), ale nie jest jednym z pięciu najczęściej używanych i ukryłbym go w całym kodzie (ponieważ utrudnia zrozumienie, jaki algorytm to jest i gdzie jest klucz).

Aby ukryć algorytm szyfrowania w kodzie: weź wersję open source, zrozum jego przepływ (które funkcje wywołują inne w jakiej kolejności), a następnie zmień nazwy wszystkich zmiennych, pól struktury i nazw funkcji (dla pewności) i rozprowadź funkcje w całej bazie kodu, w różnych obiektach i modułach, prawdopodobnie również czasowo oddzielając ich wykonanie (wykonaj jeden element szyfrowania, a następnie zrób coś innego, a następnie po kilku ms wróć do niego z pozornie niezwiązanego fragmentu kodu i wykonaj inną fazę szyfrowania itd.). Klucz można ukryć w ten sam sposób, jako liczbę pozornie niezwiązanych stałych w twoich klasach, które są dostępne w czasie wykonywania przez różne ukryte części algorytmu szyfrowania.

Czy to wszystko ma sens ekonomiczny, to zupełnie inny temat.

Tobia
źródło
Nie wiem ... Utrudnia to tylko grę ... Ale dziękuję za pomoc! Dam z siebie wszystko!
Daniel Béjar,