Powiedzmy, że stworzyłem prosty program, który pobiera plik .dat
zaszyfrowany 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?
encryption
binary
Daniel Béjar
źródło
źródło
Odpowiedzi:
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.
źródło
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ć.
źródło
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 .
źródło
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.
źródło