Szyfrowanie tekstu metodą XOR

Poniedziałek, 20 Kwietnia 2009, 21:09
Czas czytania 1 minuta, 51 sekund
Zgodne z GM: gm5 gm6 gm7 gm8 gms2
Jak szybko i skutecznie zaszyfrować tekst.
Tworzysz grę i chcesz szybko zaszyfrować np. list wyników, czy zapis stanu gry, tak aby gracz nie mógł go edytować? Trzeba zatem swoje dane zaszyfrować. Jak zrobić to szybko? Używając metody XOR. Jeżeli nie wiesz czym jest XOR odsyłam do lektury na Wikipedię.
XOR ma tą magiczną właściwość, że cokolwiek przez niego przepuścimy daje nam inną liczbę, ale przepuszczone ponownie daje początkowy wynik.

Pierwsze co zrobimy, to skrypt doXor (dodaj skrypt w folderze Scripts).

kod var _klucz,i,_znaki,_len;
argument0 = string( argument0 );
_znaki = '';
_len = string_length( argument0 );
_klucz = 666;


for ( i = 1; i <= _len; i += 1 )
{
_znaki += chr( ord( string_char_at( argument0, i ) ) ^ _klucz );
}

return _znaki;

Po kolei opowiadam co on robi:
1. Tworzymy zmienne tymczasowe - nasz klucz szyfrowania, i potrzebne do pętli, znaki to zmienna która zapamiętuje zaszyfrowany tekst, a len to długość podanego tekstu.
2. W razie gdyby argument przekazany do skryptu był cyferkami, zamieniamy go na string.
3. Ustalamy znaki na pusty string.
4. Sprawdzamy długość tekstu.
5. Ustalamy sobie nasz klucz. Ten sam klucz musi być użyty do odszyfrowania.
6. Zaczynamy pętlę od 1 do ostatniej litery naszego stringa.
7. Do zmiennej znaki dodajemy wynik działania naszej magicznej funkcji szyfrującej.
Od środka: kopiujemy znak na pozycji i, zamieniamy go na liczbę kodu ASCII ( ord ), za pomocą funkcji XOR ( ^ ) porównujemy z naszym kluczem, a potem z powrotem zamieniamy na string (chr). Całość dodajemy do zmiennej znaki.
8. Zwracamy zaszyfrowany tekst.

Sprawdzamy działanie programu.

Tworzymy nowy obiekt. W create dajemy kod:

kod
txt = 'test szyfrowania xor';

txt = doXor( txt );
show_message( txt );

txt = doXor( txt );
show_message( txt );

Uruchamiamy program. Jak widać, po pierwszym szyfrowaniu dostajemy co najmniej dziwne literki, po ponownym szyfrowaniu wszystko jest jak było.

Ot i cała tajemnica.

Ahh.... ustawcie własny klucz, dla bezpieczeństwa.
Pamiętajcie, ten sposób jest dość prosty do złamania, ale tak naprawdę każdy system da się złamać, najważniejsze jest to, że 99% osób zniechęci się widząc krzaczki i nie będzie szukać sposobu na odszyfrowanie zawartości. Poza tym, nie każdy wpadnie na to, że szyfrujemy tak banalną metodą ...
Komentarze (łącznie 30, wyświetlam 16 - 30):
HuderLord (Czw., 15 Paź. 09, 21:52)
#16

rotacja? tzn. co odwrócenie bitów? Nie za bardzo wiem jak to zrobić :P
Jak masz jakieś linki przydatne to zapodaj.

P
PsichiX (Czw., 15 Paź. 09, 21:58)
#17

rotacja to przesuniecie bitow lub wartosci bajtu, np.: masz dane oraz haslo i szyfrowanie:
xor(haslo):dane; rot(haslo):dane; xor(haslo):dane;
co oznacza ze majac haslo stosujesz z nim xora na danych, potem obracasz bajt (dodajesz/odejmujesz o wartosc znaku hasla), i znowu xorujesz haslem dane.
A deszyfrowanie to odwrotna kolejnosc (zarowno krokow jak i sposobu rotacji (jak szyfrujac dodajesz, to deszyfrujac odejmiesz))

P
PsichiX (Czw., 15 Paź. 09, 22:01)
#18

najwazniejsze w szyfrowaniu jest by nie zdradzac metody bo wtedy Cie rozgryza szybciej, wiec teraz to co napisalem moze byc niebezpieczne, wiec pokombinuj z tym, mozesz dac wiecej krokow, kombinuj :)

HuderLord (Czw., 15 Paź. 09, 22:04)
#19

spróbuję coś pokombinować.

DarkTeam (śro., 18 Maj. 11, 06:49)
#20

^^ jak to rozkminie to i sie przyda ;]

Robert Prus (śro., 18 Maj. 11, 18:56)
#21

Dodam że siła kryptograficzna xor leży w długości klucza. Przy spełnieniu kilku warunków można uczynić z niego one-time pad, metodę odporną na brute force. Jedyny problem to przekazanie wygenerowanego hasła odbiorcy.

gnysek (śro., 18 Maj. 11, 20:41)
#22

Jeśli szyfrujesz literka po literce, to długość klucza nie ma znaczenia, bo ASCII które mamy w GM8.0 to raptem 255 znaków, zatem kluczem będzie zawsze modulo 256.

Robert Prus (śro., 18 Maj. 11, 21:28)
#23

Nawet jeśli każda literka ma inny klucz?

gnysek (śro., 18 Maj. 11, 21:34)
#24

No, a ja odszyfrujesz jak dasz każdej literce inny klucz ? :D

Platyna (śro., 18 Maj. 11, 21:51)
#25

Wystarczy by kolejność stosowanych kluczy była stała. Jakakolwiek funkcja. Najlepiej potęgi dużej liczby pierwszej. :D

mentos_96 (śro., 18 Maj. 11, 22:11)
#26

to ciekawy pomysł... :)

Robert Prus (Czw., 19 Maj. 11, 09:41)
#27

gnysek: szyfruję tekst "gmclan" szyfrem "omglol". Teraz nowy tekst=ord('g') xor ord('o') + ord('m') xor ord('m') + ord('c') xor ord('g') itd. Nie xoruję przez tą samą liczbę każdą literę, o to mi chodzi.

gnysek (Czw., 19 Maj. 11, 14:29)
#28

No tak, jeśli to jest stała kombinacja to owszem. Nie wiem dlaczego pomyślałem o pewnej losowości klucza - może dla tego, że to utrudniało by odszyfrowanie... ale z drugiej strony, jako pierwszy znak można by wcale nie podawać pierwszej litery, ale własnie jakiś identyfikator mówiący jaki zestaw kluczy użyć - i wtedy faktycznie jest to jakaś losowośc.

Robert Prus (Czw., 19 Maj. 11, 14:53)
#29

Losowość i unikalność klucza wymagana jest do one-time pada, problem to przekazanie tego klucza odbiorcy. Podobno korespondencje rządów usa i rosji były kodowane w ten sposób + klucz długości samej wiadomości

mentos_96 (Czw., 19 Maj. 11, 15:44)
#30

To też ciekawa opcja, jednakże losowośc klucza jest strasznie prosta, jeżeli pierwszy/trzydziesty drugi/osiemset szesnasty/ostatni znak ma byc taki sam. Wtedy znajdujemy dany znak, na pętli for/while/do wyciągamy sobie klucz i odszyfrowujemy dokument. Zrobiłem sobie nawet paczkę skryptów do tego i szczerze mówiąc - działa.

Najnowsze wersje GameMakera:

Stabilna
2024.2.0.132 • 2024.2.0.163
wydana 54 dni temu
LTS
2022.0.2.51 • 2022.0.2.49
wydana 193 dni temu
Beta
2024.400.0.549 • 2024.400.0.567
wydana  4 dni temu
= IDE, = Runtime
Użytkownicy online
2 użytkowników aktywnych:
gości: 1, userów: 1
 Adriann
(~ostatnie 15 minut)
Discord
22 użytkownicy online na discordzie:
Kysiu, s..., Alice, DungeonFairy🧚, Nitro Slav, Carl-bot, Add92, Kowu, Kuzyn, Filyps, fervi, LadyLush, chleb, MKP (GEM), Dyno, ZYGZAK, Miłosz, m..., HappyOrange, l..., Shockah, 🧁Cupcake🧁
Shoutbox
gnysek (20:44, 11.04.24)
Niektórzy dlatego wybierają GMEdit. Ale ja liczę na Code Editor 2, tylko na razie zbyt zbugowany jest.
Tymon (16:11, 11.04.24)
Stitch dla mnie osobiście jest lepszy bo nie musze kopać się z interfejsem GMa i mogę tylko pisać kod.
Tymon (16:05, 11.04.24)
Yes. Obecny nie jest taki zły, jak zainstalowałem najnowszą stabilną to w porównaniu z tym czego używałem... 10 lat temu...? Wszystko wydaje się lepsze.
gnysek (22:48, 10.04.24)
bscotch/stitch ? Ja czekam na fixy do nowego edytora, bo wszystko wydaje się dziś lepsze od tego obecnego :D
Tymon (19:54, 10.04.24)
Hm, Stitch okazuje się całkiem dobrą alternatywą dla wbudowanego edytora
Wojo (22:16, 08.04.24)
siemano huder myślałem, że zniknąłeś całkiem z gmclanu bo na discordzie cie nie ma :D
I am Lord (00:37, 05.04.24)
O dzięki :D
gnysek (09:58, 02.04.24)
Znalazłem na podstawie jego postów: youtube.com/@Jakim_
I am Lord (20:16, 01.04.24)
Ktoś ogarnia jakie konto miał Jakim na YT?
gnysek (16:07, 29.03.24)
Nowy Edytor kodu jednak po świętach
Starsze wpisy znajdziesz w Archiwum.
Ankieta
Ile zarobiłeś do tej pory na grach stworzonych w GM?