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.8.1.171 • 2024.8.1.218
wydana 75 dni temu
LTS
2022.0.3.83 • 2022.0.3.98
wydana  3 dni temu
Beta
2024.1100.0.686 •
2024.1100.0.707
 0.13.0

wydana 9 dni temu
= IDE, = Runtime, = GMRT
Użytkownicy online
1 użytkownik aktywny:
gości: 1,
(~ostatnie 15 minut)
Discord
40 użytkowników online na discordzie:
Kysiu, 🧁Cupcake🧁, Alice, Carl-bot, EchoDuck, p..., GibkiKaktus, lethian, Wielki Druid, GMRussell, fervi, 𝕳𝖚𝖌𝖔 𝕲𝖔𝖓𝖝𝖆𝖑𝖊𝖝, m..., Kalor, antek, HappyOrange, Moldis, Arrekin, yazaa, Domeen0, Dyno, Deusald, szmalu, Qlken, Morro, 21Lancz, Ulti, m..., bagno, Tidżi, Mtax, Draczeq, Sporek, Huder, l..., moeglich, s..., Add92, Krzysiek1250, exigo
Shoutbox
gnysek (11:46, 17.11.24)
Witamy, witamy!
baca (12:22, 16.11.24)
To już 25 lat.. Witam po paru latach nieobecności.
gnysek (11:05, 15.11.24)
Natomiast obecne forum istnieje od 2004, jak z iglu.cz na gmclan.org przeszliśmy i od tego czasu nie było resetów danych.
gnysek (12:35, 13.11.24)
Ogólnie GMCLAN istnieje 22 lata, ale na to trofeum nie zrobiłem (jeszcze xD)
Chell (20:41, 08.11.24)
wow, ta emotka w ogóle nie wygląda jak : O xD
Chell (20:40, 08.11.24)
tylko? :O 4tk ma 15
Borek (18:12, 07.11.24)
Właśnie dostałem powiadomienie z forum, że jestem na GMClanie 18 lat :D Ja pierdzielę...
S
Sutikku (08:43, 18.10.24)
TIL, gamemaker jest starszy ode mnie
gnysek (16:04, 15.10.24)
Za równo miesiąc, GameMaker kończy 25 lat.
Wojo (15:38, 05.09.24)
Ciekawe
Starsze wpisy znajdziesz w Archiwum.
Ankieta
Ile zarobiłeś do tej pory na grach stworzonych w GM?