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:

LTS
2026.0.0.16 • 2022.0.3.99
wydana 150 dni temu
Beta
2026.100.0.1182 •
2026.100.0.1126
•
 GMRT beta 0.22.4

wydana  3 dni temu
= IDE, = Runtime, = GMRT
Użytkownicy online
1 użytkownik aktywny:
gości: 1,
(~ostatnie 15 minut)
Discord
42 użytkownicy online na discordzie:
Miłosz, 🧁Cupcake🧁, MorDan, Alice, LeD, 21Lancz, Carl-bot, pABLO, h..., Fox, p..., GibkiKaktus, s..., lethian, Sporek, Wielki Druid, TobiasM (Morgo), Tival, Tidżi, 𝕳𝖚𝖌𝖔 𝕲𝖔𝖓𝖝𝖆𝖑𝖊𝖝, 𝕯𝖎𝖆𝖓𝖆, Threef, RogerDodg3r, Uzjel, NOTALOSZISZITER, Murrri, HappyOrange, Dyno, szmalu, Morro, sutikku, draczek, Danieo, Arrekin, Voytec, 𝓐𝓷𝓪𝓼𝓽𝓪𝓼𝓲𝓪, l..., Borek, g..., Krzysiek1250, Shockah, xVANiLL
Shoutbox
Borek (19:01, 24.10.26)
Kurde, forum zaczyna zalewać gówno z Claude twórców... :/ ale w sumie jakiś ruch jest :D. P.S. gnysek weź ogarnij tu jakieś normalne okno do pisana shoutów, bo to jakaś masakra jest...
gnysek (23:05, 08.10.26)
Były takie próby, widać co z tego wyszło ;)
Kuzyn (17:06, 08.10.26)
może forum musi rozszerzyć działalność mocniej i skupiać ogólnie polski gamedev hihi
S
Sutikku (18:26, 05.10.26)
zapytaj onet zamknęło działalność, wizaz zamknęło działalność, krajobraz nie jest łatwy
Wojo (16:30, 28.09.26)
To świadczy o tym, że gmclan ma jeszcze duży potencjał, ale niestety nie jest on wykorzystywany tak jak należy.
Adriann (12:33, 28.09.26)
No włąśnie kurcze..nic tu się nie dzieje od lat a i tak wchodzę prawie coddziennie :D
Kuzyn (12:04, 19.09.26)
:] :]
gnysek (13:01, 04.09.26)
Dzięki! :D
S
Sutikku (11:08, 04.09.26)
gmclan to moje go-to żeby sprawdzić czy działa mi internet
Wojo (16:25, 03.09.26)
Pytanie tylko co z tym faktem możemy zrobić my jako użytkownicy? - przede wszystkim udzielać się więcej. Ja ogólnie lubię dużo mówić, dużo pisać, mało robić, ale poza mną obecnie jest może kilku użytkowników, którzy coś tutaj wkleją raz na ruski rok.
Starsze wpisy znajdziesz w Archiwum.
Ankieta
Ile zarobiłeś do tej pory na grach stworzonych w GM?