Protéger ses fichiers [RESOLU]

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Yrahen
Messages : 51
Inscription : sam. 01/sept./2012 4:14

Protéger ses fichiers [RESOLU]

Message par Yrahen »

Bonjour à tous,

Tout d'abord, je tiens a dire que j'ai tenté d'utiliser le bouton de recherche avant de creer ce post, mais je n'ai trouvé aucune reponse qui correspond a mes attentes. Si jamais il existe deja un topic et que je l'ai raté, désolé d'avance.

Pour resituer le contexte, je travaille sur mon interpreteur pour un jeu de role textuel. Ainsi, lorsque le joueur arrive dans une nouvelle salle, utiliser un objet ou combat un monstre, l'interpreteur ouvre le fichier correspondant ( j'utilise une potion de vie, ca ouvre le fichier "potion de vie.y", rien de bien sorcier pour l'instant ).

Le fichier ouvert contient les instructions pour l'interpreteur, dans le cas de la potion de vie ca sera un truc du genre :
Vie:+10
Afficher:Vous gagnez 10pv!

LE SOUCIS :

Si quelqu'un ouvre le fichier potion de vie, et decide de remplacer le Vie:+10 par Vie:+100000, c'est genant. De la meme maniere, il pourrait transformer une banale épée en cuivre en MasterSword qui OS tout les boss du jeu. C'est encore plus génant.

MA QUESTION :

Je pense que tout le monde aura compris mon probleme mais je vais le formuler clairement : est il possible de cacher un fichier de manière fiable? Je parle bien de cacher, et non pas empecher la modification.

J'ai d'abord pensé a utiliser une bdd sqlite a la place. Mais le soucis est le meme, une base sqlite s'ouvre sans trop de difficulté. J'ai ensuite pensé a enregistrer les fichiers en question sur un serveur distant, et les fichiers interprétés seraient telechargés au compte-goutte et supprimé après utilisation, mais pour du coup le jeu ne serait pas fonctionnel en hors ligne.

Merci d'avance :)
Dernière modification par Yrahen le sam. 08/août/2015 11:27, modifié 1 fois.
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Protéger ses fichiers

Message par falsam »

Bonjour Yrahen. Tu pourrais crypter les données de ton fichier de ton fichier

Code : Tout sélectionner

Procedure.s EncryptText(text$, key$)
  Protected keylen = Len(key$), cc, result$
  *keyptr.character = @key$
  *readptr.character = @text$
  *encrypted.character = AllocateMemory(Len(text$))
  *writeptr.Character = *encrypted
  While *readptr\c
    *writeptr\c = *readptr\c ! *keyptr\c ! keylen
    *keyptr = @key$ + cc%keylen
    *readptr+1 : *writeptr+1 : cc+1
  Wend
  *result = AllocateMemory(MemorySize(*encrypted)*1.4)
  Base64Encoder(*encrypted, MemorySize(*encrypted),*result, MemorySize(*result))
  result$ = PeekS(*result)
  FreeMemory(*encrypted)
  FreeMemory(*result)
  ProcedureReturn result$
EndProcedure

Procedure.s DecryptText(text$, key$)
  Protected keylen = Len(key$), cc, size, result$
  *encrypted.character = AllocateMemory(Len(text$))
  size = Base64Decoder(@text$, Len(text$), *encrypted, MemorySize(*encrypted))
  *decrypted = AllocateMemory(size)
  *keyptr.character = @key$
  *readptr.character = *encrypted
  *writeptr.Character = *decrypted
  While *readptr\c
    *writeptr\c = *readptr\c ! *keyptr\c ! keylen
    *keyptr = @key$ + cc%keylen
    *readptr+1 : *writeptr+1 : cc+1
  Wend
  result$ = PeekS(*decrypted, size)
  FreeMemory(*encrypted)
  FreeMemory(*decrypted)
  ProcedureReturn result$
EndProcedure


;Zone de test
Key.s = "macledesecurite"

a$ = EncryptText("Vie:+10", Key)
Debug a$
b$ = DecryptText(a$, Key)
Debug b$
Code de jeslar360 sur le forum anglais

C'est aussi une méthode pour crypter les données d'une base de données SQlite.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Protéger ses fichiers

Message par Ar-S »

C'est une solution efficace pour ce qui est de la lecture directe. Si tu veux crypter simplement des champs d'un fichier prefs, tu peux crypter tes strings en md5 et ajoutant quelques bidouilles pour que ce ne soit pas trop easy de les repérer.
Par exemple en inversant (reversetring) le code md5 et en ajoutant qques strings à la fin ou au début que tu ne liras pas lors du décodage.

Je me suis amusé à faire ce petit exemple :

Code : Tout sélectionner

Procedure.s Crypt(stringEntree.s)
  Protected CRYPT$

    CRYPT$ = MD5Fingerprint(@StringEntree, Len(StringEntree))
    CRYPT$ = ReverseString(CRYPT$)
    ; Ajout de 4 caractères de a à z à la fin du MD5
    Randomisation.s =""
    For i = 1 To 4
      Car.s = Chr(Random(122,97))
    Randomisation + Car 
    Next
    Debug "INFO : 4 Strings ajoutées au pif : " + Randomisation
    CRYPT$ + Randomisation

  ProcedureReturn CRYPT$
EndProcedure

Procedure Decrypt(String.s, NbFake, CRYPT.s) ; NbFake permettra d'indiquer le nbr de lettre inutiles (F66A donc 4)

  DECRYPT$  = Left(CRYPT,Len(CRYPT)-4)
  DECRYPT$  = ReverseString(DECRYPT$)
  MD5$ = MD5Fingerprint(@String, Len(String))
  
  If MD5$ = DECRYPT$
    OK = #True
  Else
    Ok = #False
  EndIf
  ProcedureReturn OK
EndProcedure  


; //// INFO POUVANT ETRE VIREE \\\\\\\
MOTDEPASSE.s  = "PUREBASIC"
MDP_ECRIT.s   = Crypt(MOTDEPASSE)
MessageRequester("VERIF", "MD5 de base pour " + MOTDEPASSE + ": " + MD5Fingerprint(@MOTDEPASSE, Len(MOTDEPASSE)) + Chr(13) + MOTDEPASSE + " crypté donne : " + MDP_ECRIT,#PB_MessageRequester_Ok)

; ////////////////////////////////////

; --------- PROGRAMME -------------

MOTDEPASSE.s  = "PUREBASIC"
CRYPTED.s = Crypt("PUREBASIC")

mgpd$ = InputRequester("MDP","Mot de passe","",#PB_InputRequester_Password)

If Decrypt(mgpd$,4,CRYPTED) = 1
  MessageRequester("YEAH", "Decryptage OK",#PB_MessageRequester_Ok)
Else
  MessageRequester("ERROR", "Tentative de modification détectée, votre ordinateur va imploser et des vénusiens vont enlever votre chat pour faire des expériences.",#PB_MessageRequester_Ok)
EndIf
EnJoY
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
case
Messages : 1545
Inscription : lun. 10/sept./2007 11:13

Re: Protéger ses fichiers

Message par case »

je pense cependant qu'avoir un fichier par type d'objet est une mauvaise approche.
tu vas avoir un jeu qui sans arrêt ira ouvrir,lire,fermer des fichiers ce qui est même si c'est très rapide de nos jours prend plus de temps que pécher les informations dans la mémoire de l'ordinateur.
de plus les petits fichiers prennent plus de place que leur taille réelle sur les disques en raison du formatage des disques actuels.

c'est juste un conseil car si tu commence ton jeu il est sans doute encore temps de repenser a ce genre de choses.
ImageImage
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Protéger ses fichiers

Message par Ar-S »

Je pense que ce genre de prefs est pour reprendre ou le joueur s'est arrêté. Une sorte de savegame.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
case
Messages : 1545
Inscription : lun. 10/sept./2007 11:13

Re: Protéger ses fichiers

Message par case »

tu as encore lu en diagonale ? :p
Pour resituer le contexte, je travaille sur mon interpreteur pour un jeu de role textuel. Ainsi, lorsque le joueur arrive dans une nouvelle salle, utiliser un objet ou combat un monstre, l'interpreteur ouvre le fichier correspondant ( j'utilise une potion de vie, ca ouvre le fichier "potion de vie.y", rien de bien sorcier pour l'instant ).

Le fichier ouvert contient les instructions pour l'interpreteur, dans le cas de la potion de vie ca sera un truc du genre :
Vie:+10
Afficher:Vous gagnez 10pv!
ImageImage
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Protéger ses fichiers

Message par Ar-S »

héhé ^^ en fait j'avais lu le sujet initiale mais le temps de faire le code j'étais partie dans mon interprétation lunaire :)
Il est claire que pour de la donnée statique, il vaut mieux y mettre en "dur" dans ton code, c'est bien plus simple et surtout plus rapide.
Ce n'est pas quelques valeurs qui vont plomber ton programme. Tu peux y aller.
Le fichier texte est vraiment utile au sauvegarde et aux prefs initiales (ainsi qu'au récit de ton aventure éventuellement), mais surement pas à ton +10 vie +5 attaque +13 défense...
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Yrahen
Messages : 51
Inscription : sam. 01/sept./2012 4:14

Re: Protéger ses fichiers

Message par Yrahen »

Bonjour à tous,

Tout d'abord, merci pour vos code. Celui de Ar-S m'interesse pas mal et je vais me pencher dessus.

Pour ce qui est du stockage dans des fichiers, ca presente certains inconvenients mais aussi quelques avantages :

- Dans l'exemple de la potion de vie que j'ai donné, il y a 2 lignes, c'est basique. Mais j'ai aussi des objets qui contiennent 20lignes. Si il n'y avait que 2 ou 3 objets, les stocker en dur dans l'exe aurait été plus pratique effectivement. Mais il y a pas loin de 100 objets, je vous raconte pas le dawa que ca serait si tout etait dans le code brut.

- Le fait d'avoir des fichiers en dehors de l'exe permet aussi de faire quelque chose de plus modulable. Quand le jeu se connecte et qu'une connexion internet est detecté, il va rechercher sur le serveur des mises à jour, eventuellement telecharger de nouveaux objets/salles/mobs ect.. ce qui serait impossible avec un code en brut.

Je ne sais absolument pas ce que ca vaux niveau performance d'ouvrir et de fermer des fichiers a repetition, ce qui est certain c'est qu'effectivement ca doit etre bien moins rapide que de stocker dans l'exe. Mais ca me permet de pouvoir modifier en continu le jeu.

Mais merci quand meme pour les suggestions, tout est bon à prendre ! :)
"L'imagination est plus importante que la connaissance."
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Protéger ses fichiers

Message par Ar-S »

Pour ce qui est des mises à jour je vois ce que tu veux dire mais en y reflechissant ce n'est pas plus judicieux.

Attention à ne pas confondre données fixes : puissance potions, sorts, armure, stuff etc.. et les données du joueur : Armure X point de vie etc...
Tu devrais tout de même mettre en dur les données fixes sous forme "d'include" via des datasections par exemple mais pas forcément.
Seul les infos modifiable du joueur devraient être en fichier pour sauver sa progression.
Pour tes mises à jour, il faudra que le joueur télécharge de toute façon quelque chose, autant que ce soit l'exe.
Ce sera moins contraignant pour toi de faire mettre à jour le programme que de devoir recréer un txt crypté (ce qui veut dire recompiler aussi quelque chose) et le télécharger.

C'est mon avis mais fait comme bon te semble.
Si tu souhaites resté en fichier, il faudra tout de même 2 txt différents.
Toujours 1 pour le joueur et un pour les données fixes. Par contre pas besoin de les ouvrir 3500 fois.
- Ouverture du jeu :
* lecture et stockage des données fixes dans une liste chainée structurée ou une map
* lecture des données du joueur
- Je joueur joue
* Modification des données dans les map/list...
- Le joueur quitte
* sauvegarde du fichier joueur
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Yrahen
Messages : 51
Inscription : sam. 01/sept./2012 4:14

Re: Protéger ses fichiers

Message par Yrahen »

Alors,

Effectivement j'ai des fichiers attitrés aux objets, salles ect, et un affecté uniquement aux statistiques du joueur. Et effectivement je ne l'ouvre qu'au debut et modifie les informations stockées dans une map que je n'enregistre qu'a la fin.

Pour ce qui est des includes, cette idée me plaisait bien au début. D'ailleurs comme tu dis, le joueur va telecharger des fichiers, pourquoi ne pas telecharger l'exe directement. Mais ma crainte c'est que ca devienne un veritable bordel et je sais pas trop comment organiser le code en consequence ( une centaine d'objet, autant de lieux ect, ca fait un paquet d'includes )...

Par contre, datasection, j'ai jamais touché a ce truc et j'ai pas l'impression d'avoir deja vu le concept dans d'autres langages. J'ai pas envie de passer pour un noob, mais je comprend pas vraiment l'interet ( je viens de fouiller dans le fichier d'aide )

A noter par ailleurs que je ne suis pas fermé a l'idée de changer l'architecture de mon jeu ( au contraire je dirais même ), mais encore une fois je vois vraiment pas comment organiser le code pour gerer X includes..
"L'imagination est plus importante que la connaissance."
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Protéger ses fichiers [RESOLU]

Message par Ar-S »

La datasection est une possibilité pour stocker des données à la chaine mais ce n'est pas forcément le plus aisé pour ce cas de figure.
C'est une solution parmi d'autres.
Petit exemple :

Code : Tout sélectionner

Structure Salle
  Nom.s
  Gold.i
  IDarme.b
  IDarmor.b
  IDpotion.b
  IDscroll.b
  NBmob.b
EndStructure

NewMap Salle.salle()

; Stockage des données
Restore Salle

Read.s Salle$   ;  Entrée
Salle(Salle$)\Nom = Salle$
Salle()\Gold = 20
Salle()\IDarme = 0
Salle()\IDpotion = 1
Salle()\IDarmor = 0
Salle()\IDscroll = 1
Salle()\NBmob = 0


Read.s Salle$   ; passe à Salle 1
Salle(Salle$)\Nom = Salle$
Salle()\Gold = 130
Salle()\IDarme = 2
Salle()\IDpotion = 4
Salle()\IDarmor = 8
Salle()\IDscroll = 0
Salle()\NBmob = 2

; traitement
ForEach Salle()
  Debug "Dans la salle " + MapKey(Salle()) + " il y a " + salle()\Gold + " OR et " + salle()\IDpotion + " potion(s)" 
  If salle()\NBmob > 0
    Debug "Attention il y a " + salle()\NBmob + " ennemi(s) qui s'approche(nt) d'un air menaçant !"
  EndIf  
  Debug ""
Next
  

;datasection
  DataSection
    
    Salle:
    Data.s "Entrée","Prison","Salle 2","salle3","donjon1","donjon2"
    
;     NomMob:    
;     Data.s "Arzo","Tetinos","Zloup","Guerrier des ombres","Tisseuse de l'enfer"
;     
;     PvMob:
;     Data.i 250,311,150,100,50
    
  EndDataSection


~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Protéger ses fichiers [RESOLU]

Message par Ar-S »

Perso je procèderai en incluant un fichier texte contenant les données sous forme :
MOB1.s = "sonnom","saclasse","pointdevie","pointarmure","degat"
MOB2.s = "sonnom","saclasse","pointdevie","pointarmure","degat"
MOB3.s = "sonnom","saclasse","pointdevie","pointarmure","degat"

Voilà ce que je ferai. J'ai pas séparé les fichiers pour poster un seule code mais tout est commenté.
ça génère quelque chose de claire et facilement modifiable lorsque ça va grossir.

Code : Tout sélectionner

;  // Exemple Structure RPG by Ar-S //

; Fichier mob.pbi
; Tu inclus ça dans ton code principale
M1.s = "Brutos;Ogre Mage;200;50;20"
M2.s = "Nefrem;Demon;220;70;25"
M3.s = "Lilia;Succube;150;80;20"
; //////////////////////////////////////////////

; Fichier macros.pbi
; Macro pour simplifier la tache de stockage
; tu inclus ça dans ton code principale
Macro CreaMap(NomMob,M)
  
Mob(NomMob)\Nom = StringField(M, 1, ";")
Mob()\Classe = StringField(M, 2, ";")
Mob()\PV = Val(StringField(M, 3, ";"))
Mob()\PA = Val(StringField(M, 4, ";"))
Mob()\Force = Val(StringField(M, 5, ";"))

EndMacro

Macro Affiche(NomMob)
  FindMapElement(Mob(), NomMob)
  Debug "Vous rencontrez "+ Str(Random(5)) + Mob()\Nom
  Debug "Classe : " + Mob()\Classe
  Debug "Point de vie : " + Mob()\PV
  Debug "Armure : " + Mob()\PA
  Debug "Degat : " + Mob()\Force
  Debug "" ; separateur
EndMacro


; /////////////////////////////////////////////////////////////
; Fichier Principale : Main.pb ///////////////////

; Include "datas/mob.pbi"
; Include "datas/macros.pbi"

Structure MOB
  Nom.s
  Classe.s
  PV.i
  PA.i
  Force.i
EndStructure

NewMap Mob.Mob()

; On stock tout rapidement grace à notre macro
CreaMap("MOB1",M1.s)
CreaMap("MOB2",M2.s)
CreaMap("MOB3",M3.s)

; on vérifie vite fait grace à la macro affiche.
; Commençons par le MOB 2 puis 1 puis 3

Affiche("MOB2")
Affiche("MOB1")
Affiche("MOB3")
  
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Yrahen
Messages : 51
Inscription : sam. 01/sept./2012 4:14

Re: Protéger ses fichiers [RESOLU]

Message par Yrahen »

L'inconvenient de cette methode est que les monstres ne sont pas personnalisables.
Par exemple pour Lilia ( bien la référénce d'ailleurs ), c'est compliqué avec cette methode de dire "a 25% life elle se heal" ou un truc du genre.
Mais je vais quand même creuser l'idée, merci ! :)
"L'imagination est plus importante que la connaissance."
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Protéger ses fichiers [RESOLU]

Message par Ar-S »

Je vois pas le soucis.
Tu ajoutes un champ à ta structure qui sera l'ID des caractéristiques spéciales.

Code : Tout sélectionner

Structure MOB
  Nom.s
  Classe.s
  PV.i
  PA.i
  Force.i
  SPECIAL_ID.i 
EndStructure
Tu mets par exemple 1 comme SPECIAL_ID pour heal si -28% vie
Tu mets par exemple 2 comme SPECIAL_ID pour inflige 2 PV aux joueurs si PV = 0
etc...
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Répondre