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.13.1.193 • 2024.13.1.242
wydana 83 dni temu
LTS
2022.0.3.85 • 2022.0.3.99
wydana 218 dni temu
Beta
2024.1400.0.841 •
2024.1400.0.836
 0.17.0

wydana  6 dni temu
= IDE, = Runtime, = GMRT
Użytkownicy online
2 użytkowników aktywnych:
gości: 1, userów: 1
 Adriann
(~ostatnie 15 minut)
Discord
39 użytkowników online na discordzie:
RogerDodg3r, Miłosz, Alice, LeD, Carl-bot, Saus, 🧁Cupcake🧁, 21Lancz, Wielki Druid, Alkapivo, Kowu, LadyLush, tomqz, OdrzuconyKrakers, r..., Threef, Skini, chleb, HappyOrange, Pako, Arrekin, Dyno, 🆅🅸🆃🅾74🅼, szmalu, Voytec, Ulti, Danieo, antek, Tidżi, g..., Kandif, l..., moeglich, s..., Add92, Krzysiek1250, h..., Shockah, m...
Shoutbox
gnysek (10:36, 04.07.25)
Bo wszyscy piszą na discordzie :)
M
Modnar23 (20:08, 29.06.25)
Ja po 13 latach postanowiłem się zalogować i widzę, że straszne pustki na forum. Kiedyś to aż huczało na forum. :)
Chell (08:18, 26.06.25)
to masz krótką pamięć, bo od 2014 jakoś nie wiadomo ilu nowych userów nie przybyło :-D
p
pablo1517 (18:34, 16.06.25)
Ja w sumie żadnego z tych nicków nie kojarze poza Gnyskiem xD
gnysek (10:00, 16.06.25)
Odwiedzić starych dobrych znajomych.
S
Sutikku (01:48, 14.06.25)
nie wiem który to już rok, że ciągle mechanicznie wchodzę na gmclan, w sumie sam nie wiem po co
S
Sutikku (01:47, 14.06.25)
SIEMA! U mnie znośnie
p
pablo1517 (21:48, 07.06.25)
Siema wszystkim! Co tam slychac?
gnysek (13:44, 10.04.25)
Za 3-4 miesiące GM przejdzie na wydania "półroczne", więc korzystanie z wersji beta żeby sprawdzić nowości będzie wskazane :P
Adriann (18:09, 08.04.25)
Odpowiadam, dzisiaj :D
Starsze wpisy znajdziesz w Archiwum.
Ankieta
Ile zarobiłeś do tej pory na grach stworzonych w GM?