| [Tutoriel] [Non Finis] Créer ses propres sauvegardes | |
|
+13robinlife Qual SPLN Boudou Chulien CoDeAVE Mass nicoulas [TheDarkTiger] Randal Wargamer glcraft onilink_ 17 participants |
|
Auteur | Message |
---|
Caly Utilisateur confirmé: Rang ****
Messages : 1285 Localisation : Haute Normandie Projet Actuel : Capturer, apprivoiser et dresser des Pokémons sauvages pour faire des spectacles de rue et en faire mon métier.
| Sujet: Re: [Tutoriel] [Non Finis] Créer ses propres sauvegardes Ven 30 Mar 2012 - 10:42 | |
| Bon j'ai une petite question.
Je suis entrain coder un mapEditor qui sera à disposition des joueurs pour créer leurs propres stages mais dans la logique je m'en sers aussi pour créer mes stages dispo dans l'histoire du jeu en lui même.
Donc dans le dossier du jeu j'ai un dossier 'levels' avec deux sous-dossiers 'game' et 'edited'. Pour le 'edited' pas de problème chacun mettra ce qu'il veux dedans tant que le fichier '.lv' sera valide il sera lu. Mais pour mes stages officiels comme que je fait pour les protéger? Genre j'ai le '1.lv' comment empêcher qu'un malin qui est bloqué sur ce stage édite un stage, le nome '1.lv' et remplace mon niveau?
Es ce que je doit le bloquer avec une 'clef' ou dois-je plutôt mettre mes stages dans des scripts (ce que j'ai pas trop envie pour raison de poids du fichier et donc du chargement) ?
Je pense que l'histoire de la clef est la meilleur solution mais je ne sais pas comment faire. Je doit passer par du MD5 ou faire ça en binaire?
|
|
| |
onilink_ Modérateur
Messages : 9180 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: [Tutoriel] [Non Finis] Créer ses propres sauvegardes Ven 30 Mar 2012 - 16:55 | |
| Ce que je te conseille, c'est de commencer par faire ce qu'il y a en 4 – Protection de la sauvegarde
Et par dessus tu crypte avec un algo tout bête. Le top sous GM (rapide et efficace) c'est le cryptage xor avec une clé générée par une fonction chaotique comme random (mais tu peut faire bien mieux en bidouillant).
Et même si niveau sécurité c'est pas non plus un truc de fou, ça m'étonnerais qu'un gars lambda réussisse a contourner cette protection. Il irais plus vite en essayant de décompiler ton jeu. |
|
| |
Caly Utilisateur confirmé: Rang ****
Messages : 1285 Localisation : Haute Normandie Projet Actuel : Capturer, apprivoiser et dresser des Pokémons sauvages pour faire des spectacles de rue et en faire mon métier.
| Sujet: Re: [Tutoriel] [Non Finis] Créer ses propres sauvegardes Ven 30 Mar 2012 - 21:39 | |
| Alors si je comprend bien je fous une clef unique référencé dans une ds_list pour chaque niveau officiel. Et je crypte cette clef unique avec une Master_key en binaire? genre: - Code:
-
list = ds_liste_create(); ds_list_add(list, 'Roger'); ds_list_add(list, 'Bernard'); ds_list_add(list, 'Annic'); //etc...
master_key='14856315648751374683521';
if(lv==1) final_key = ds_list_find_value(list,0)^master_key; Ça fonctionne ou faut convertir le ds_list_add et master_key en binaire? Et si oui comment? |
|
| |
onilink_ Modérateur
Messages : 9180 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: [Tutoriel] [Non Finis] Créer ses propres sauvegardes Sam 31 Mar 2012 - 0:42 | |
| Non en fait le cryptage se fait octet par octet, lors de la sauvegarde binaire. Je te ferais un exemple si tu veux, mais en attendant :
key : 5 12 6 78 230 word : zelda
-> cryptage z ^ 5 e ^ 12 l ^ 3 d ^ 78 a ^ 230
Et donc pour chaque caractère tu crypte et tu écris dans un fichier binaire. Pour les nombres le mieux serais de créer une fonction spéciale, qui s'occupe de crypter chaque octet automatiquement avant de le save.
|
|
| |
Caly Utilisateur confirmé: Rang ****
Messages : 1285 Localisation : Haute Normandie Projet Actuel : Capturer, apprivoiser et dresser des Pokémons sauvages pour faire des spectacles de rue et en faire mon métier.
| Sujet: Re: [Tutoriel] [Non Finis] Créer ses propres sauvegardes Sam 31 Mar 2012 - 0:54 | |
| C'est peut etre l'heure qui fait ça mais je ne pige pas comment faire. Genre pour le moment j'ai ça qui fonctionne trés bien : - Code:
-
var f,n;
f= file_bin_open('argument0',1); n= instance_count;
b_write_usint(f, n);
for({var i; i=0;} i<n; i+=1){ with( instance_find(all,i) ){ b_write_sint(f, x); b_write_sint(f, y); b_write_usint(f, object_index); } }
file_bin_close(f); (la protection de la sauvegarde je sais la faire mais pas encore fait) Comment je fait pour balance la clef crypter? Avant le file_bin_close je fait : - Code:
-
b_write_int(f,word^key); ?? |
|
| |
onilink_ Modérateur
Messages : 9180 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: [Tutoriel] [Non Finis] Créer ses propres sauvegardes Sam 31 Mar 2012 - 15:34 | |
| En fait il faut voir ta clé comme un tableau d'octet, car quand tu crypte un octet, tu le crypte avec la case correspondante de ta clé (c'est pour ça qu'en général on utilise une chaine de caractères). De plus tu ne peut pas utiliser b_write_int comme ça. Tu as deux solutions : -Soit tu fait un b_write_int(f,word^key); avec key étant 4 octets de la clé complète car un int tient sur 4 octets (solution la plus simple je pense) -Soit tu écrit une fonction b_write_int_crypt, qui va elle même crypter les octets un a un avant de les écrire.
Si c'est pas clair je te ferais un exemple, mais demain car la cay pas possible :b
|
|
| |
Caly Utilisateur confirmé: Rang ****
Messages : 1285 Localisation : Haute Normandie Projet Actuel : Capturer, apprivoiser et dresser des Pokémons sauvages pour faire des spectacles de rue et en faire mon métier.
| Sujet: Re: [Tutoriel] [Non Finis] Créer ses propres sauvegardes Dim 1 Avr 2012 - 0:25 | |
| Bon une fois n'est pas coutume mais là je pige rien. Sinon en essayant de comprendre j'ai fait des recherches sur le binaire et je suis tombé sur ça : - Spoiler:
- Code:
-
/* ********************************************** ************File Encryption System************ **********Written by: Kevin Haroldsen********* **********************************************
Use this to encrypt/decrypt a file using XOR encryption. It can be used to prevent editing of save files, or for other things.
Arguments:
The First Argument is the file you want to encrypt. Use a full path. Make sure it is a string.
The Second Argument is the encryption key. It must be a string. It can be as long as you want. Longer is more secure.
How it works: The script generates a key based on the key you provide and the game id. It then goes through the file and encrypts each byte using xor encryption, rotating through the key. By rotating through the key, two identical letters next to each other will not be look the same when encrypted. Sometimes the file is encrypted enough that it is interpreted as Japanese in notepad- seeing it as Unicode.
How XOR encryption works:
XOR is a logic gate. The are 8 logic gates-AND,OR,XOR,YES,NAND,NOR,NXOR,and NOT.
When you enter values into a logic gate, it returns a value. All return either 0 or 1. 0 or 1 can mean No or Yes, False or True, or some others.
XOR generally allows you to input two values. If those values are the same, it will output 0. Otherwise it will output 1.
Here is a truth table for XOR: ____________________ |Input1|Input2|Output| |______|______|______| | 0 | 0 | 0 | |______|______|______| | 1 | 0 | 1 | |______|______|______| | 0 | 1 | 1 | |______|______|______| | 1 | 1 | 0 | |______|______|______|
This is simple boolean XOR.
Binary XOR uses boolean XOR to edit its values. With binary xor, it's almost like it's an operand like addition or multiplication.
First of all, binary is a base 2 number system only using 0 and 1. It is what computers use. Counting from 0 from 5 is 0 1 10 11 100 101 This is the binary system. With computers, a bit is a 0 or a 1. a byte is a group of 8 bits.
Binary XOR edits a whole byte of data. The number 106 is 01101010 The number 203 is 11001011
So... 106 xor 203 is:
0 1 1 0 1 0 1 0 | | | | | | | | \|/ \|/ \|/ \|/ \|/ \|/ \|/ \|/ xor 1 1 0 0 1 0 1 1 ------------------------------- 1 0 1 0 0 0 0 1 10100001 is 161. So, 106 xor 203 is 161.
Each letter or number in a text file is a byte. For example, the letter Q is 1010001. So if you xor 1010001 (Q) with 1001011 (K), you get 11010, which is a right arrow mark. Now if you xor 11010 with 1001011 (K), you get 1010001, which is Q. So, you can encrypt and decrypt with a key.
NOTE: Files encrypted with this will only be correctly decrypted with the same game- or at least with the same game id.
Written January 6th 2010 */
//define all variables var file,read,keypos,gmid,i,key;
if !file_exists(argument0) then return (-1);
//define all variables. i=0; keypos=0; gmid=string(game_id); key="" read=0 file=0
repeat (5) { gmid=gmid + gmid;//repeat the game id 5 times for a long key. };
//Generate an long key using the game_id and the key given. done by XORing the key and the game_id. repeat(floor(string_length(string(game_id))*5 )) {
key=key + chr( ord(string_copy(gmid,i,2)) ^ (ord(string_char_at(argument1,keypos))-floor(i/3)) );//XOR the key and the game id
i+=1; keypos+=1; if keypos>string_length(argument1) then keypos=1;
};
keypos=0;//make sure you are at the beginning of the key.
file=file_bin_open(argument0,2);//open the file, using basic binary functions
file_bin_seek(file,0);//make sure you are at the start of the file
//This is where you actually encrypt the file. Notice the actual encryption is only a few lines long. repeat(file_bin_size(file)) { read=file_bin_read_byte(file);//read the chosen byte. Doing so will also advance to the next byte. file_bin_seek(file,file_bin_position(file)-1);//go to the byte before, returning to the byte that you just read. file_bin_write_byte(file,read ^ ord(string_char_at(key,keypos)));//write the encrypted byte where a byte was previously.It will advance to the next byte keypos+=1;//go to the next character in the key to encrypt with. if keypos>string_length(key) then keypos=1; };
file_bin_close(file);//close the binary file when finished.
return (1);//returns 1 to confirm it worked.
C'est bien ou pas? |
|
| |
Caly Utilisateur confirmé: Rang ****
Messages : 1285 Localisation : Haute Normandie Projet Actuel : Capturer, apprivoiser et dresser des Pokémons sauvages pour faire des spectacles de rue et en faire mon métier.
| Sujet: Re: [Tutoriel] [Non Finis] Créer ses propres sauvegardes Lun 2 Avr 2012 - 23:17 | |
| |
|
| |
onilink_ Modérateur
Messages : 9180 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: [Tutoriel] [Non Finis] Créer ses propres sauvegardes Lun 2 Avr 2012 - 23:41 | |
| Ben disons que c'est un peu compliqué pour un simple cryptage xor x) |
|
| |
Caly Utilisateur confirmé: Rang ****
Messages : 1285 Localisation : Haute Normandie Projet Actuel : Capturer, apprivoiser et dresser des Pokémons sauvages pour faire des spectacles de rue et en faire mon métier.
| Sujet: Re: [Tutoriel] [Non Finis] Créer ses propres sauvegardes Dim 15 Avr 2012 - 1:36 | |
| Oni tu peut m'expliquer ce que fait exactement ce code stp? Car je ne le comprend pas. (j'en ai pas besoin je veux juste le comprendre.) - Code:
-
/* ** Usage: ** bytes_to_b64(str) ** ** Arguments: ** str a string of bytes, eight bits per character ** ** Returns: ** a string of base64 digits (RFC 3548), six bits per character ** ** GMLscripts.com */ { var str,len,pad,tab,b64,i,bin; str = argument0; len = string_length(str); pad = "="; tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; b64 = ""; for (i=0;i<len;i+=3) { bin[0] = ord(string_char_at(str,i+1)); bin[1] = ord(string_char_at(str,i+2)); bin[2] = ord(string_char_at(str,i+3)); b64 += string_char_at(tab,1+(bin[0]>>2)); b64 += string_char_at(tab,1+(((bin[0]&3)<<4)|(bin[1]>>4))); if (i+1>=len) b64 += pad; else b64 += string_char_at(tab,1+(((bin[1]&15)<<2)|(bin[2]>>6))); if (i+2>=len) b64 += pad; else b64 += string_char_at(tab,1+(bin[2]&63)); } return b64; } |
|
| |
onilink_ Modérateur
Messages : 9180 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: [Tutoriel] [Non Finis] Créer ses propres sauvegardes Dim 15 Avr 2012 - 15:11 | |
| Ben il fait passer des données codées en base 256 (octet par octet quoi) en données de base 64, qui peuvent donc être écrites avec des caractères courants ASCII. L'intérêt c'est que ça te permettrait par exemple de poster une musique midi (ou tout autre fichier pas trop lourd) sur le forum en format texte, et donc de pas avoir besoin de l'uploader (par conséquent pas de risque de lien mort :b)
Donc en argument0, str contient les données (je rappelle que chaque caractère peut contenir 256 valeurs, on peu donc utiliser un string comme un buffer) tab c'est les caractères qui forment la base 64
Ensuite le gars prend 3 octets par 3 octets, et les codes en base 64. Pourquoi 3 ? Parce qu'en base 64, il faut 6 bits pour coder chaque valeur, et en base 256 il en faut 8. Et 3*8 = 24 et est donc divisible par 6 -> On code donc 3 octets en 4 caractères dans la base 64.
Donc ici il récupère les 3 octets a convertir : bin[0] = ord(string_char_at(str,i+1)); bin[1] = ord(string_char_at(str,i+2)); bin[2] = ord(string_char_at(str,i+3));
Ici on obtient le premier caractère en base 64 sur les 4 b64 += string_char_at(tab,1+(bin[0]>>2));
bin[0]>>2 permet de récupérer les 6 premiers bits du premier octet a coder, et donc on peut ensuite avoir le caractère correspondant en allant le récupérer a cette position dans notre chaine qui contient les caractères de la base 64 (tab).
Ici on fait de même avec le second b64 += string_char_at(tab,1+(((bin[0]&3)<<4)|(bin[1]>>4)));
(((bin[0]&3)<<4) | (bin[1]>>4)) récupère les 2 bits de poids faible du premier octet, et les assemble avec les 4 bits de poids fort du second octet (d'ou les décalages binaires)
Ici on regarde si la conversion est fini (le = correspond au caractère inséré par défaut si la taille du fichier a convertir n'est pas multiple de 3) if (i+1>=len) b64 += pad; else b64 += string_char_at(tab,1+(((bin[1]&15)<<2)|(bin[2]>>6)));
Toujours le même procédé, on découpe nos octets de façon a avoir nos 6 bits suivants..
if (i+2>=len) b64 += pad; else b64 += string_char_at(tab,1+(bin[2]&63));
Again :b
Voila voila, si y a un truc qui t'échappe dit le moi :b
|
|
| |
Caly Utilisateur confirmé: Rang ****
Messages : 1285 Localisation : Haute Normandie Projet Actuel : Capturer, apprivoiser et dresser des Pokémons sauvages pour faire des spectacles de rue et en faire mon métier.
| Sujet: Re: [Tutoriel] [Non Finis] Créer ses propres sauvegardes Dim 15 Avr 2012 - 15:25 | |
| Nop c'est clair, j'ai pigé merci. Par contre l'intérêt dans un jeu m'échappe un peut, mais ce n'est qu'un détails.
Merci. |
|
| |
onilink_ Modérateur
Messages : 9180 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: [Tutoriel] [Non Finis] Créer ses propres sauvegardes Dim 15 Avr 2012 - 15:49 | |
| Ben dans un jeu ça sert a ... rien x) |
|
| |
Caly Utilisateur confirmé: Rang ****
Messages : 1285 Localisation : Haute Normandie Projet Actuel : Capturer, apprivoiser et dresser des Pokémons sauvages pour faire des spectacles de rue et en faire mon métier.
| Sujet: Re: [Tutoriel] [Non Finis] Créer ses propres sauvegardes Dim 15 Avr 2012 - 18:11 | |
| Je suis toujours sur du binaire (et j'ai trop du mal). Pourquoi - Code:
-
show_message(454561215648645416857423416587486454654 mod 256) ça fait planter GM? |
|
| |
onilink_ Modérateur
Messages : 9180 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: [Tutoriel] [Non Finis] Créer ses propres sauvegardes Dim 15 Avr 2012 - 18:24 | |
| Disons que GM est très limité au niveau des calculs (en même temps il utilise des double, pour faire des opérations sur les entiers cpas top). Petite expérience, entre 99999999 en debug mode et regarde le résultat :b
Et de toute façon même en C/C++ tu n'aurais pas pu faire cette opération en utilisant les types de données standards. Alors avec GM c'est même pas la peine d'y penser x) |
|
| |
Contenu sponsorisé
| Sujet: Re: [Tutoriel] [Non Finis] Créer ses propres sauvegardes | |
| |
|
| |
| [Tutoriel] [Non Finis] Créer ses propres sauvegardes | |
|