Coder un fichier prefs

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Coder un fichier prefs

Message par Ar-S »

Cls a écrit :Attention base64 n'est pas un algo de cryptage. C'est uniquement pour coder des données et non les sécuriser. L'un des avantages est qu'il n'y a pas d'accent dans les messages transmis. :D C'est, par exemple, utilisé pour transmettre les pièces jointes des mails.
D'ou mon auto-citation
Tu peux tout à fait l'utiliser puis le modifier en remplaçant par exemple tous les P par des A ou autre variation comme d'ajouter une donnée fictive etc....
Ainsi tu parts avec un codage assez simple pour finir avec un codage plus complexe et personnel.
~~~~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
Parole De JOJO
Messages : 446
Inscription : mar. 25/mai/2010 17:24
Localisation : Bnei Brak, Israel

Re: Coder un fichier prefs

Message par Parole De JOJO »

lol
RetourAuto, c'est koi cette fonction?
Parole De JOJO
Messages : 446
Inscription : mar. 25/mai/2010 17:24
Localisation : Bnei Brak, Israel

Re: Coder un fichier prefs

Message par Parole De JOJO »

ok je l'ai trouve sur le forum
merci ca marche aussi pour l'hebreu
c'est genial, pile ce ke je cherche

dobro, pour toi l'hebreu ne veut rien dire, mais ce fichier comporte des infos qui vallent de l'argent (peut etre j'en parlerais un jour ici, si tu est sage...)
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Coder un fichier prefs

Message par Ar-S »

Autant pour moi :) c'est vrai que j'ai fais une lib perso comprenant quelques fonctions que j'utilise souvent..
Mais attention Parole de Jojo, ajoute y une modification utilisant par exemple une clé que tu choisiras (ou tu peux faire en sorte que en fonction d'une clé que l'utilisateur entre) car le base64 est décodable avec n'importe quel outil.
~~~~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
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Coder un fichier prefs

Message par Backup »

Parole De JOJO a écrit : dobro, pour toi l'hebreu ne veut rien dire, mais ce fichier comporte des infos qui vallent de l'argent (peut etre j'en parlerais un jour ici, si tu est sage...)
je m'en fout en fait !
ce qui est important pour toi, ne l'est surement pas pour moi ;)

de plus , je ne suis absolument pas venal ,et je n'ai pas un rond
pourtant ... (mais je suis pas malheureux , car mes intérêts ne se trouve pas là ;) )
Parole De JOJO
Messages : 446
Inscription : mar. 25/mai/2010 17:24
Localisation : Bnei Brak, Israel

Re: Coder un fichier prefs

Message par Parole De JOJO »

Ar-S a écrit :Autant pour moi :)
Mais attention Parole de Jojo, ajoute y une modification utilisant par exemple une clé que tu choisiras (ou tu peux faire en sorte que en fonction d'une clé que l'utilisateur entre) car le base64 est décodable avec n'importe quel outil.
une cle?
c'est que je suis un debutant mwa.....
c'est koi ca encore une cle?
tu est sur que c'est pas bon comme ca? (j'etais deja tout content de pouvoir coder mon fichier)
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Coder un fichier prefs

Message par Ar-S »

Mais oui c'est pas bon le décodage base64 se fait d'après un simple script web.

Mais comme je te l'ai dit, tu peux toi même pimenter la souplette en y ajoutant des ingrédients à toi.

Voila du concret, mes petites procédures permettent ici de décoder/coder le base64 ce qui rend la tache d'un pirate plus difficile non pas à casser mais à comprendre ce que sais que ce code. Il n'en demeure pas moins un exemple concret de ce que je voulais dire.

PrefEncode() procède ainsi :

1 - Il encode le contenu en base64
2 - il compte le nombre de lettre du "mot clé"
3 - pour chaque caractère, il ajoute à sa valeur ascii la longueur du mot clé.
4 - il ajoute à gauche la première lettre du mot cle

prefDecode()
Il fait l'inverse...
1 - Il récupère le mot crypter sans tenir compte du 1er caractère
2 - pour chaque caractère, il soustrait la longueur du mot clé à la valeur ascii
3 - il décode le base64 à nouveau propre.

Voilà ce que ça donne en code et du forme.

Code : Tout sélectionner

; Procédure CB64 (Cesare Base 64)
; Par Ar-S / Cyrille Landivier / http://ldvmultimedia.com
; 16 Fev 2011 - PB 4.51 x86

Procedure.s PrefEncode(Str2code.s,clePref.s)
  ;> Ar-S
    test.s = Str2code
    enc.s = Space(1024) 
    Crypt.s=""
    Base64Encoder(@test, StringByteLength(test), @enc, 1024)
    ;----Encodage du base64
    Tcle.l=Len(clePref)
    If Tcle<1
      ProcedureReturn "-1"
    Else
      For i = 1 To Len(enc)
        lettre$=Chr(Asc(Mid(enc,i,1))+Len(clePref))
        Crypt.s+lettre$
      Next
      
      Crypt=Left(clePref,1)+Crypt
    EndIf

  ProcedureReturn Crypt
EndProcedure

Procedure.s PrefDecode(Str2decode.s,clePref.s)
  ;> Ar-S
  ; Recomposition du bas64
  Tcle.l=Len(clePref)
  If Tcle<1
    ProcedureReturn "-1"
  Else
    Crypt.s=""
    test.s = Mid(Str2decode,2,Len(Str2decode)-1)
    dec.s = Space(1024)

    For i = 1 To Len(test)
      lettre$=Mid(test,i,1)
      lettre$=Chr(Asc(lettre$)-Tcle)
      Crypt.s+lettre$
    Next
    test=Crypt
    ;----Décodage du base64
    Base64Decoder(@test, StringByteLength(test), @dec, 1024)
  EndIf

  ProcedureReturn dec
EndProcedure


String$="Compte num 2012456"

Cle$="toto"
Code.s=PrefEncode(String$,Cle$)
Decode.s = PrefDecode(Code,Cle$)
Code2.s=PrefEncode(String$,"ratatouille")

MessageRequester("test",String$+" devient "+Code+" avec la cle "+Cle$+Chr(10)+"Alors qu'il devient : "+Code2 +" avec la clé : "+"ratatouille")



~~~~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
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Coder un fichier prefs

Message par Ollivier »

Ar-S a écrit :Mais comme je te l'ai dit, tu peux toi même pimenter la souplette en y ajoutant des ingrédients à toi.
Ah, la raclure! Tu pouvais pas en parler un peu plus tôt, j'aurai pu aller m'en prendre!!!

Va falloir que j'attende demain midi maintenant... J'ai l'image du plat de 2 litres rempli d'une soupe de poisson bien épaisse et fumante avec une miche et du poivre à côté...

Faut pas me faire des trucs comme ça à l'approche de la pleine lune, je ne vais pas pouvoir fermer l'oeil maintenant!
Parole De JOJO
Messages : 446
Inscription : mar. 25/mai/2010 17:24
Localisation : Bnei Brak, Israel

Re: Coder un fichier prefs

Message par Parole De JOJO »

merci bcp
je vais essayer
pat
Messages : 411
Inscription : mar. 24/nov./2009 15:13

Re: Coder un fichier prefs

Message par pat »

Bonjour à tous,

Pourquoi rester en Base64 quand on peut faire mieux via AES Encoder/Decoder que je décrits plus haut.
En effet, même si Ar-S fait en sorte que Base64 ne puisse se traduire par n'importe quel programmeur, avec AES Encoder/Decoder il suffit seulement de changer les valeurs des DATA, que personne d'autre que vous connaissez. Et le tour est joué. Et je pense que AES est plus sécurisant que le Base64.
De plus, selon la doc, Base64 ne sert que pour traduire des valeurs ASCII alors que AES pour tous les types.
Réfléchissez-y.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Coder un fichier prefs

Message par Backup »

pour moi le mieux c'est le Xor avec une clef de la meme longueur que le text a crypter !

ou alors mon petit Algo de cryptage qui utilise le Pseudo aléatoire ;)
pat
Messages : 411
Inscription : mar. 24/nov./2009 15:13

Re: Coder un fichier prefs

Message par pat »

C'est comme tu le sens Dobro.
Chacun voit midi à sa porte, comme on dit.
Mais ne pas enterrer AES Encoder/Decoder trop vite.
:)
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Re: Coder un fichier prefs

Message par Guimauve »

Bonjour à tous,

Voici un code que j'avais poster sur le forum anglais justement pour crypter un fichier *.pref. Le code en est 2 sources, désolé pour ceux qui n'aime pas avoir le code divisé en plusieurs fichiers.

A+
Guimauve

Code : Tout sélectionner

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; CODE GÉNÉRÉ AUTOMATIQUEMENT, NE PAS MODIFIER À
; MOINS D'AVOIR UNE RAISON TRÈS TRÈS VALABLE !!!
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Code généré par : Dev-Type V2.0.0
; Nom du projet : PukallCipher algorithm 
; Nom du fichier : PukallCipher.pbi
; Version du fichier : 1.0.1
; Programmation : OK
; Programmé par : Alexander Pukall 
; Modifié par : Guimauve
; Date : 11-06-2009
; Mise à jour : 09-05-2010
; Codé pour PureBasic V4.50
; Plateforme : Windows, Linux, MacOS X
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Constantes Niveau Sécurité <<<<<

#PUKALLCIPHER_LEVEL_LOW = 64
#PUKALLCIPHER_LEVEL_GOOD = 128
#PUKALLCIPHER_LEVEL_HIGH = 256
#PUKALLCIPHER_LEVEL_EXTREME = 512
#PUKALLCIPHER_LEVEL_INFERNAL = 1024
#PUKALLCIPHER_LEVEL_INSANE = 2048
#PUKALLCIPHER_LEVEL_RIDICULOUS = 4096
#PUKALLCIPHER_LEVEL_LUDICROUS = 8192

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Constantes de dimensionnement <<<<<

#PUKALLCIPHER_X1A0_MAX = 512
#PUKALLCIPHER_CLE_MAX = 1024

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Déclaration de la Structure <<<<<

Structure PukallCipher

	Level.w
	Ax.l
	Bx.l
	cx.l
	dx.l
	Si.l
	X1A2.l
	Res.l
	Counter.l
	Inter.l
	X1A0.l[#PUKALLCIPHER_X1A0_MAX]
	Cle.c[#PUKALLCIPHER_CLE_MAX]
	X1A0Max.l
	CleMax.l
	BufferLength.l
	Char.c
	Rep.c
	Dxx.c
	Exx.c
	Cfc.l
	Cfd.l

EndStructure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Les observateurs <<<<<

Macro GetPukallCipherLevel(PukallCipherA)

	PukallCipherA\Level

EndMacro

Macro GetPukallCipherAx(PukallCipherA)

	PukallCipherA\Ax

EndMacro

Macro GetPukallCipherBx(PukallCipherA)

	PukallCipherA\Bx

EndMacro

Macro GetPukallCiphercx(PukallCipherA)

	PukallCipherA\cx

EndMacro

Macro GetPukallCipherdx(PukallCipherA)

	PukallCipherA\dx

EndMacro

Macro GetPukallCipherSi(PukallCipherA)

	PukallCipherA\Si

EndMacro

Macro GetPukallCipherX1A2(PukallCipherA)

	PukallCipherA\X1A2

EndMacro

Macro GetPukallCipherRes(PukallCipherA)

	PukallCipherA\Res

EndMacro

Macro GetPukallCipherCounter(PukallCipherA)

	PukallCipherA\Counter

EndMacro

Macro GetPukallCipherInter(PukallCipherA)

	PukallCipherA\Inter

EndMacro

Macro GetPukallCipherX1A0(PukallCipherA, Index)

	PukallCipherA\X1A0[Index]

EndMacro

Macro GetPukallCipherCle(PukallCipherA, Index)

	PukallCipherA\Cle[Index]

EndMacro

Macro GetPukallCipherX1A0Max(PukallCipherA)

	PukallCipherA\X1A0Max

EndMacro

Macro GetPukallCipherCleMax(PukallCipherA)

	PukallCipherA\CleMax

EndMacro

Macro GetPukallCipherBufferLength(PukallCipherA)

	PukallCipherA\BufferLength

EndMacro

Macro GetPukallCipherChar(PukallCipherA)

	PukallCipherA\Char

EndMacro

Macro GetPukallCipherRep(PukallCipherA)

	PukallCipherA\Rep

EndMacro

Macro GetPukallCipherDxx(PukallCipherA)

	PukallCipherA\Dxx

EndMacro

Macro GetPukallCipherExx(PukallCipherA)

	PukallCipherA\Exx

EndMacro

Macro GetPukallCipherCfc(PukallCipherA)

	PukallCipherA\Cfc

EndMacro

Macro GetPukallCipherCfd(PukallCipherA)

	PukallCipherA\Cfd

EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Les mutateurs <<<<<

Macro SetPukallCipherLevel(PukallCipherA, P_Level)

	GetPukallCipherLevel(PukallCipherA) = P_Level

EndMacro

Macro SetPukallCipherAx(PukallCipherA, P_Ax)

	GetPukallCipherAx(PukallCipherA) = P_Ax

EndMacro

Macro SetPukallCipherBx(PukallCipherA, P_Bx)

	GetPukallCipherBx(PukallCipherA) = P_Bx

EndMacro

Macro SetPukallCiphercx(PukallCipherA, P_cx)

	GetPukallCiphercx(PukallCipherA) = P_cx

EndMacro

Macro SetPukallCipherdx(PukallCipherA, P_dx)

	GetPukallCipherdx(PukallCipherA) = P_dx

EndMacro

Macro SetPukallCipherSi(PukallCipherA, P_Si)

	GetPukallCipherSi(PukallCipherA) = P_Si

EndMacro

Macro SetPukallCipherX1A2(PukallCipherA, P_X1A2)

	GetPukallCipherX1A2(PukallCipherA) = P_X1A2

EndMacro

Macro SetPukallCipherRes(PukallCipherA, P_Res)

	GetPukallCipherRes(PukallCipherA) = P_Res

EndMacro

Macro SetPukallCipherCounter(PukallCipherA, P_Counter)

	GetPukallCipherCounter(PukallCipherA) = P_Counter

EndMacro

Macro SetPukallCipherInter(PukallCipherA, P_Inter)

	GetPukallCipherInter(PukallCipherA) = P_Inter

EndMacro

Macro SetPukallCipherX1A0(PukallCipherA, Index, P_X1A0)

	GetPukallCipherX1A0(PukallCipherA, Index) = P_X1A0

EndMacro

Macro SetPukallCipherCle(PukallCipherA, Index, P_Cle)

	GetPukallCipherCle(PukallCipherA, Index) = P_Cle

EndMacro

Macro SetPukallCipherX1A0Max(PukallCipherA, P_X1A0Max)

	GetPukallCipherX1A0Max(PukallCipherA) = P_X1A0Max

EndMacro

Macro SetPukallCipherCleMax(PukallCipherA, P_CleMax)

	GetPukallCipherCleMax(PukallCipherA) = P_CleMax

EndMacro

Macro SetPukallCipherBufferLength(PukallCipherA, P_BufferLength)

	GetPukallCipherBufferLength(PukallCipherA) = P_BufferLength

EndMacro

Macro SetPukallCipherChar(PukallCipherA, P_Char)

	GetPukallCipherChar(PukallCipherA) = P_Char

EndMacro

Macro SetPukallCipherRep(PukallCipherA, P_Rep)

	GetPukallCipherRep(PukallCipherA) = P_Rep

EndMacro

Macro SetPukallCipherDxx(PukallCipherA, P_Dxx)

	GetPukallCipherDxx(PukallCipherA) = P_Dxx

EndMacro

Macro SetPukallCipherExx(PukallCipherA, P_Exx)

	GetPukallCipherExx(PukallCipherA) = P_Exx

EndMacro

Macro SetPukallCipherCfc(PukallCipherA, P_Cfc)

	GetPukallCipherCfc(PukallCipherA) = P_Cfc

EndMacro

Macro SetPukallCipherCfd(PukallCipherA, P_Cfd)

	GetPukallCipherCfd(PukallCipherA) = P_Cfd

EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur Reset <<<<<

Macro ResetPukallCipher(PukallCipherA)

	SetPukallCipherLevel(PukallCipherA, 0)
	SetPukallCipherAx(PukallCipherA, 0)
	SetPukallCipherBx(PukallCipherA, 0)
	SetPukallCiphercx(PukallCipherA, 0)
	SetPukallCipherdx(PukallCipherA, 0)
	SetPukallCipherSi(PukallCipherA, 0)
	SetPukallCipherX1A2(PukallCipherA, 0)
	SetPukallCipherRes(PukallCipherA, 0)
	SetPukallCipherCounter(PukallCipherA, 0)
	SetPukallCipherInter(PukallCipherA, 0)

	For Index = 0 To #PUKALLCIPHER_X1A0_MAX - 1
		SetPukallCipherX1A0(PukallCipherA, Index, 0)
	Next

	For Index = 0 To #PUKALLCIPHER_CLE_MAX - 1
		SetPukallCipherCle(PukallCipherA, Index, 0)
	Next

	SetPukallCipherX1A0Max(PukallCipherA, 0)
	SetPukallCipherCleMax(PukallCipherA, 0)
	SetPukallCipherBufferLength(PukallCipherA, 0)
	SetPukallCipherChar(PukallCipherA, 0)
	SetPukallCipherRep(PukallCipherA, 0)
	SetPukallCipherDxx(PukallCipherA, 0)
	SetPukallCipherExx(PukallCipherA, 0)
	SetPukallCipherCfc(PukallCipherA, 0)
	SetPukallCipherCfd(PukallCipherA, 0)

	; ClearStructure(PukallCipherA, PukallCipher)

EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Code généré en : 00.013 secondes (26846.15 lignes/seconde) <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

Macro Private_PukallCipherCode(PukallCipherA)
	
	SetPukallCipherDx(PukallCipherA, GetPukallCipherX1A2(PukallCipherA) + GetPukallCipherCounter(PukallCipherA))
	SetPukallCipherAx(PukallCipherA, GetPukallCipherX1A0(PukallCipherA, GetPukallCipherCounter(PukallCipherA)))
	
	SetPukallCipherBx(PukallCipherA, $015A)
	SetPukallCipherCx(PukallCipherA, $4E35)
	
	Swap GetPukallCipherAx(PukallCipherA), GetPukallCipherSi(PukallCipherA)
	Swap GetPukallCipherAx(PukallCipherA), GetPukallCipherDx(PukallCipherA)
	
	If GetPukallCipherAx(PukallCipherA) <> 0
		SetPukallCipherAx(PukallCipherA, GetPukallCipherAx(PukallCipherA) * GetPukallCipherBx(PukallCipherA))
	EndIf
	
	Swap GetPukallCipherAx(PukallCipherA), GetPukallCipherCx(PukallCipherA)
	
	If GetPukallCipherAx(PukallCipherA) <> 0
		SetPukallCipherAx(PukallCipherA, GetPukallCipherAx(PukallCipherA) * GetPukallCipherSi(PukallCipherA))
		SetPukallCipherAx(PukallCipherA, GetPukallCipherAx(PukallCipherA) + GetPukallCipherCx(PukallCipherA))
	EndIf
	
	Swap GetPukallCipherAx(PukallCipherA), GetPukallCipherSi(PukallCipherA)
	
	SetPukallCipherAx(PukallCipherA, GetPukallCipherAx(PukallCipherA) * GetPukallCipherBx(PukallCipherA))
	SetPukallCipherDx(PukallCipherA, GetPukallCipherCx(PukallCipherA) + GetPukallCipherDx(PukallCipherA))
	
	SetPukallCipherAx(PukallCipherA, GetPukallCipherAx(PukallCipherA) + 1)
	SetPukallCipherX1A2(PukallCipherA, GetPukallCipherDx(PukallCipherA))
	SetPukallCipherX1A0(PukallCipherA, GetPukallCipherCounter(PukallCipherA), GetPukallCipherAx(PukallCipherA))
	SetPukallCipherCounter(PukallCipherA, GetPukallCipherCounter(PukallCipherA) + 1)
	
	SetPukallCipherRes(PukallCipherA, GetPukallCipherAx(PukallCipherA) ! GetPukallCipherDx(PukallCipherA))
	
EndMacro

Macro Private_PukallCipherAssemble(PukallCipherA)
	
	SetPukallCipherX1A0(PukallCipherA, 0, GetPukallCipherCle(PukallCipherA, 0) * GetPukallCipherLevel(PukallCipherA) + GetPukallCipherCle(PukallCipherA, 1))
	Private_PukallCipherCode(PukallCipherA)
	SetPukallCipherInter(PukallCipherA, GetPukallCipherRes(PukallCipherA))
	
	KeyIndex = 2
	
	For Index = 1 To GetPukallCipherX1A0Max(PukallCipherA) - 1
		
		SetPukallCipherX1A0(PukallCipherA, Index, GetPukallCipherX1A0(PukallCipherA, Index - 1) ! GetPukallCipherCle(PukallCipherA, KeyIndex) * GetPukallCipherLevel(PukallCipherA) + GetPukallCipherCle(PukallCipherA, KeyIndex + 1))
		Private_PukallCipherCode(PukallCipherA)
		SetPukallCipherInter(PukallCipherA, GetPukallCipherInter(PukallCipherA) ! GetPukallCipherRes(PukallCipherA))
		KeyIndex + 2
		
	Next
	
	SetPukallCipherCounter(PukallCipherA, 0)
	
EndMacro

Procedure.s PukallCipherNormalizedKey(P_Password.s, P_Level.w)
	
	Length = Len(P_Password)
	
	If Length = 0
		Length = 1
		P_Password = " "
	EndIf 
	
	NormalizedKey.s = MD5Fingerprint(@P_Password, Length)
	
	Select P_Level
			
		Case #PUKALLCIPHER_LEVEL_LOW ; 8 Characters
			NormalizedKey = Left(NormalizedKey, 8)
			
		Case #PUKALLCIPHER_LEVEL_GOOD ; 16 Characters
			NormalizedKey = Left(NormalizedKey, 16)
			
		Case #PUKALLCIPHER_LEVEL_HIGH ; 32 Characters
			NormalizedKey = NormalizedKey
			
		Case #PUKALLCIPHER_LEVEL_EXTREME ; 64 Characters
			NormalizedKey = NormalizedKey + MD5Fingerprint(@NormalizedKey, Len(NormalizedKey))
			
		Case #PUKALLCIPHER_LEVEL_INFERNAL ; 128 Characters
			For Index = 0 To 2
				NormalizedKey = NormalizedKey + MD5Fingerprint(@NormalizedKey, Len(NormalizedKey))
			Next
			
		Case #PUKALLCIPHER_LEVEL_INSANE ; 256 Characters
			For Index = 0 To 6
				NormalizedKey = NormalizedKey + MD5Fingerprint(@NormalizedKey, Len(NormalizedKey))
			Next
			
		Case #PUKALLCIPHER_LEVEL_RIDICULOUS ; 512 Characters
			For Index = 0 To 14
				NormalizedKey = NormalizedKey + MD5Fingerprint(@NormalizedKey, Len(NormalizedKey))
			Next
			
		Case #PUKALLCIPHER_LEVEL_LUDICROUS ; 1024 Characters
			For Index = 0 To 30
				NormalizedKey = NormalizedKey + MD5Fingerprint(@NormalizedKey, Len(NormalizedKey))
			Next
			
		Default ; #PUKALLCIPHER_LEVEL_GOOD ; 16 Characters
			NormalizedKey = Left(NormalizedKey, 16)
			
	EndSelect
	
	ProcedureReturn NormalizedKey
EndProcedure

Procedure.s PukallCipherEncrypt(P_Key.s, P_Buffer.s, P_Level.w) ; P_Key - 1024 Characters Max
	
	Select P_Level
			
		Case #PUKALLCIPHER_LEVEL_LOW
			SetPukallCipherLevel(PukallCipher.PukallCipher, #PUKALLCIPHER_LEVEL_LOW)
			SetPukallCipherX1A0Max(PukallCipher, 4)
			SetPukallCipherCleMax(PukallCipher, 8)
			
		Case #PUKALLCIPHER_LEVEL_GOOD
			SetPukallCipherLevel(PukallCipher.PukallCipher, #PUKALLCIPHER_LEVEL_GOOD)
			SetPukallCipherX1A0Max(PukallCipher, 8)
			SetPukallCipherCleMax(PukallCipher, 16)
			
		Case #PUKALLCIPHER_LEVEL_HIGH
			SetPukallCipherLevel(PukallCipher, #PUKALLCIPHER_LEVEL_HIGH)
			SetPukallCipherX1A0Max(PukallCipher, 16)
			SetPukallCipherCleMax(PukallCipher, 32)
			
		Case #PUKALLCIPHER_LEVEL_EXTREME
			SetPukallCipherLevel(PukallCipher, #PUKALLCIPHER_LEVEL_EXTREME)
			SetPukallCipherX1A0Max(PukallCipher, 32)
			SetPukallCipherCleMax(PukallCipher, 64)
			
		Case #PUKALLCIPHER_LEVEL_INFERNAL
			SetPukallCipherLevel(PukallCipher, #PUKALLCIPHER_LEVEL_INFERNAL)
			SetPukallCipherX1A0Max(PukallCipher, 64)
			SetPukallCipherCleMax(PukallCipher, 128)
			
		Case #PUKALLCIPHER_LEVEL_INSANE
			SetPukallCipherLevel(PukallCipher, #PUKALLCIPHER_LEVEL_INSANE)
			SetPukallCipherX1A0Max(PukallCipher, 128)
			SetPukallCipherCleMax(PukallCipher, 256)
			
		Case #PUKALLCIPHER_LEVEL_RIDICULOUS
			SetPukallCipherLevel(PukallCipher, #PUKALLCIPHER_LEVEL_RIDICULOUS)
			SetPukallCipherX1A0Max(PukallCipher, 256)
			SetPukallCipherCleMax(PukallCipher, 512)
			
		Case #PUKALLCIPHER_LEVEL_LUDICROUS
			SetPukallCipherLevel(PukallCipher, #PUKALLCIPHER_LEVEL_LUDICROUS)
			SetPukallCipherX1A0Max(PukallCipher, 512)
			SetPukallCipherCleMax(PukallCipher, 1024)
			
		Default 
			SetPukallCipherLevel(PukallCipher, #PUKALLCIPHER_LEVEL_GOOD)
			SetPukallCipherX1A0Max(PukallCipher, 8)
			SetPukallCipherCleMax(PukallCipher, 16)
			
	EndSelect
	
	For KeyIndex = 0 To GetPukallCipherCleMax(PukallCipher) - 1
		SetPukallCipherCle(PukallCipher, KeyIndex, Asc(Mid(P_Key, KeyIndex + 1,1)))
	Next
	
	SetPukallCipherSi(PukallCipher, 0)
	SetPukallCipherX1A2(PukallCipher, 0)
	SetPukallCipherCounter(PukallCipher, 0)
	
	SetPukallCipherBufferLength(PukallCipher, Len(P_Buffer) - 1)
	
	For BufferIndex = 0 To GetPukallCipherBufferLength(PukallCipher)
		
		SetPukallCipherChar(PukallCipher, Asc(Mid(P_Buffer, BufferIndex + 1,1)))
		
		Private_PukallCipherAssemble(PukallCipher)
		
		SetPukallCipherCfc(PukallCipher, GetPukallCipherInter(PukallCipher) >> 8)
		SetPukallCipherCfd(PukallCipher, GetPukallCipherInter(PukallCipher) & 255)
		
		For KeyIndex = 0 To GetPukallCipherCleMax(PukallCipher) - 1
			SetPukallCipherCle(PukallCipher, KeyIndex, GetPukallCipherCle(PukallCipher, KeyIndex) ! GetPukallCipherChar(PukallCipher))
		Next
		
		SetPukallCipherChar(PukallCipher, GetPukallCipherChar(PukallCipher) ! (GetPukallCipherCfc(PukallCipher) ! GetPukallCipherCfd(PukallCipher)))
		SetPukallCipherDxx(PukallCipher, GetPukallCipherChar(PukallCipher) >> 4)
		SetPukallCipherExx(PukallCipher, GetPukallCipherChar(PukallCipher) & 15)
		CryptedBuffer.s + Chr($61 + GetPukallCipherDxx(PukallCipher))
		CryptedBuffer + Chr($61 + GetPukallCipherExx(PukallCipher))
		
	Next
	
	ResetPukallCipher(PukallCipher)
	
	ProcedureReturn CryptedBuffer
EndProcedure

Procedure.s PukallCipherDecrypt(P_Key.s, P_Buffer.s, P_Level.w) ; P_Key - 1024 Characters Max
	
	Select P_Level
			
		Case #PUKALLCIPHER_LEVEL_LOW
			SetPukallCipherLevel(PukallCipher.PukallCipher, #PUKALLCIPHER_LEVEL_LOW)
			SetPukallCipherX1A0Max(PukallCipher, 4)
			SetPukallCipherCleMax(PukallCipher, 8)
			
		Case #PUKALLCIPHER_LEVEL_GOOD
			SetPukallCipherLevel(PukallCipher.PukallCipher, #PUKALLCIPHER_LEVEL_GOOD)
			SetPukallCipherX1A0Max(PukallCipher, 8)
			SetPukallCipherCleMax(PukallCipher, 16)
			
		Case #PUKALLCIPHER_LEVEL_HIGH
			SetPukallCipherLevel(PukallCipher, #PUKALLCIPHER_LEVEL_HIGH)
			SetPukallCipherX1A0Max(PukallCipher, 16)
			SetPukallCipherCleMax(PukallCipher, 32)
			
		Case #PUKALLCIPHER_LEVEL_EXTREME
			SetPukallCipherLevel(PukallCipher, #PUKALLCIPHER_LEVEL_EXTREME)
			SetPukallCipherX1A0Max(PukallCipher, 32)
			SetPukallCipherCleMax(PukallCipher, 64)
			
		Case #PUKALLCIPHER_LEVEL_INFERNAL
			SetPukallCipherLevel(PukallCipher, #PUKALLCIPHER_LEVEL_INFERNAL)
			SetPukallCipherX1A0Max(PukallCipher, 64)
			SetPukallCipherCleMax(PukallCipher, 128)
			
		Case #PUKALLCIPHER_LEVEL_INSANE
			SetPukallCipherLevel(PukallCipher, #PUKALLCIPHER_LEVEL_INSANE)
			SetPukallCipherX1A0Max(PukallCipher, 128)
			SetPukallCipherCleMax(PukallCipher, 256)
			
		Case #PUKALLCIPHER_LEVEL_RIDICULOUS
			SetPukallCipherLevel(PukallCipher, #PUKALLCIPHER_LEVEL_RIDICULOUS)
			SetPukallCipherX1A0Max(PukallCipher, 256)
			SetPukallCipherCleMax(PukallCipher, 512)
			
		Case #PUKALLCIPHER_LEVEL_LUDICROUS
			SetPukallCipherLevel(PukallCipher, #PUKALLCIPHER_LEVEL_LUDICROUS)
			SetPukallCipherX1A0Max(PukallCipher, 512)
			SetPukallCipherCleMax(PukallCipher, 1024)
			
		Default 
			SetPukallCipherLevel(PukallCipher, #PUKALLCIPHER_LEVEL_GOOD)
			SetPukallCipherX1A0Max(PukallCipher, 8)
			SetPukallCipherCleMax(PukallCipher, 16)
			
	EndSelect
	
	For KeyIndex = 0 To GetPukallCipherCleMax(PukallCipher) - 1
		SetPukallCipherCle(PukallCipher, KeyIndex, Asc(Mid(P_Key, KeyIndex + 1, 1)))
	Next
	
	SetPukallCipherSi(PukallCipher, 0)
	SetPukallCipherX1A2(PukallCipher, 0)
	SetPukallCipherCounter(PukallCipher, 0)
	
	SetPukallCipherBufferLength(PukallCipher, Len(P_Buffer) - 1)
	
	For BufferIndex = 0 To GetPukallCipherBufferLength(PukallCipher) Step 2
		
		SetPukallCipherRep(PukallCipher, Asc(Mid(P_Buffer, BufferIndex + 1, 1)))
		SetPukallCipherDxx(PukallCipher, GetPukallCipherRep(PukallCipher) - $61)
		SetPukallCipherDxx(PukallCipher, GetPukallCipherDxx(PukallCipher) << 4)
		
		SetPukallCipherRep(PukallCipher, Asc(Mid(P_Buffer, BufferIndex + 2, 1)))
		SetPukallCipherExx(PukallCipher, GetPukallCipherRep(PukallCipher) - $61)
		SetPukallCipherChar(PukallCipher, GetPukallCipherDxx(PukallCipher) + GetPukallCipherExx(PukallCipher))
		
		Private_PukallCipherAssemble(PukallCipher)
		
		SetPukallCipherCfc(PukallCipher, GetPukallCipherInter(PukallCipher) >> 8)
		SetPukallCipherCfd(PukallCipher, GetPukallCipherInter(PukallCipher) & 255)
		SetPukallCipherChar(PukallCipher, GetPukallCipherChar(PukallCipher) ! (GetPukallCipherCfc(PukallCipher) ! GetPukallCipherCfd(PukallCipher)))
		
		For KeyIndex = 0 To GetPukallCipherCleMax(PukallCipher) - 1
			SetPukallCipherCle(PukallCipher, KeyIndex, GetPukallCipherCle(PukallCipher, KeyIndex) ! GetPukallCipherChar(PukallCipher))
		Next
		
		DecryptedBuffer.s + Chr(GetPukallCipherChar(PukallCipher))
		
	Next 
	
	ResetPukallCipher(PukallCipher)
	
	ProcedureReturn DecryptedBuffer
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< FIN DU FICHIER <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<

Code : Tout sélectionner

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; CODE GÉNÉRÉ AUTOMATIQUEMENT, NE PAS MODIFIER À
; MOINS D'AVOIR UNE RAISON TRÈS TRÈS VALABLE !!!
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Code généré par : Dev-Type V2.0.0
; Nom du projet : CryptedPreference
; Nom du fichier : CryptedPreference.pb
; Version du fichier : 1.0.0
; Programmation : OK - Prototype
; Programmé par : Guimauve
; Date : 25-06-2010
; Mise à jour : 25-06-2010
; Code PureBasic : 4.50
; Plateforme : Windows, Linux, MacOS X
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

IncludeFile "PukallCipher.pbi"

Enumeration 
	
	#CRYPTED_PREFERENCES_STYLE_EVERYTHING
	#CRYPTED_PREFERENCES_STYLE_VALUE_ONLY

EndEnumeration 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Déclaration de la Structure <<<<<

Structure CryptedPreferences
	
	Style.b
	Password.s
	Level.l
	NormalizedKey.s
	
EndStructure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Les observateurs <<<<<

Macro GetCryptedPreferencesStyle(CryptedPreferenceA)
	
	CryptedPreferenceA\Style
	
EndMacro

Macro GetCryptedPreferencesPassword(CryptedPreferenceA)
	
	CryptedPreferenceA\Password
	
EndMacro

Macro GetCryptedPreferencesLevel(CryptedPreferenceA)
	
	CryptedPreferenceA\Level
	
EndMacro

Macro GetCryptedPreferencesNormalizedKey(CryptedPreferenceA)
	
	CryptedPreferenceA\NormalizedKey
	
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Les mutateurs <<<<<

Macro SetCryptedPreferencesStyle(CryptedPreferenceA, P_Style)
	
	GetCryptedPreferencesStyle(CryptedPreferenceA) = P_Style
	
EndMacro

Macro SetCryptedPreferencesPassword(CryptedPreferenceA, P_Password)
	
	GetCryptedPreferencesPassword(CryptedPreferenceA) = P_Password
	
EndMacro

Macro SetCryptedPreferencesLevel(CryptedPreferenceA, P_Level)
	
	GetCryptedPreferencesLevel(CryptedPreferenceA) = P_Level
	
EndMacro

Macro SetCryptedPreferencesNormalizedKey(CryptedPreferenceA, P_NormalizedKey)
	
	GetCryptedPreferencesNormalizedKey(CryptedPreferenceA) = P_NormalizedKey
	
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur Reset <<<<<

Macro ResetCryptedPreferences(CryptedPreferenceA)
	
	SetCryptedPreferencesStyle(CryptedPreferenceA, 0)
	SetCryptedPreferencesPassword(CryptedPreferenceA, "")
	SetCryptedPreferencesLevel(CryptedPreferenceA, 0)
	SetCryptedPreferencesNormalizedKey(CryptedPreferenceA, "")
	
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Macro de déboguage <<<<<

Macro DebugCryptedPreferences(CryptedPreferenceA)

	Debug GetCryptedPreferencesStyle(CryptedPreferenceA)
	Debug GetCryptedPreferencesPassword(CryptedPreferenceA)
	Debug GetCryptedPreferencesLevel(CryptedPreferenceA)
	Debug GetCryptedPreferencesNormalizedKey(CryptedPreferenceA)

EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Code généré en : 00.008 secondes (15625.00 lignes/seconde) <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Les opérateurs WriteCryptedPreference <<<<<

Procedure WriteCryptedPreferenceLong(Key.s, Value.l)
	
	Shared CryptedPreferences.CryptedPreferences
	
	Select GetCryptedPreferencesStyle(CryptedPreferences)
			
		Case #CRYPTED_PREFERENCES_STYLE_EVERYTHING
			OutKey.s = PukallCipherEncrypt(GetCryptedPreferencesNormalizedKey(CryptedPreferences), Key, GetCryptedPreferencesLevel(CryptedPreferences))
			OutValue.s = PukallCipherEncrypt(GetCryptedPreferencesNormalizedKey(CryptedPreferences), Str(Value), GetCryptedPreferencesLevel(CryptedPreferences))
			
		Case #CRYPTED_PREFERENCES_STYLE_VALUE_ONLY
			OutKey.s = Key
			OutValue.s = PukallCipherEncrypt(GetCryptedPreferencesNormalizedKey(CryptedPreferences), Str(Value), GetCryptedPreferencesLevel(CryptedPreferences))
			
	EndSelect 
	
	WritePreferenceString(OutKey, OutValue)
	
EndProcedure 

Procedure WriteCryptedPreferenceInteger(Key.s, Value.i)
	
	Shared CryptedPreferences.CryptedPreferences
	
	Select GetCryptedPreferencesStyle(CryptedPreferences)
			
		Case #CRYPTED_PREFERENCES_STYLE_EVERYTHING
			OutKey.s = PukallCipherEncrypt(GetCryptedPreferencesNormalizedKey(CryptedPreferences), Key, GetCryptedPreferencesLevel(CryptedPreferences))
			OutValue.s = PukallCipherEncrypt(GetCryptedPreferencesNormalizedKey(CryptedPreferences), Str(Value), GetCryptedPreferencesLevel(CryptedPreferences))
			
		Case #CRYPTED_PREFERENCES_STYLE_VALUE_ONLY
			OutKey.s = Key
			OutValue.s = PukallCipherEncrypt(GetCryptedPreferencesNormalizedKey(CryptedPreferences), Str(Value), GetCryptedPreferencesLevel(CryptedPreferences))
			
	EndSelect 
	
	WritePreferenceString(OutKey, OutValue)
	
EndProcedure 

Procedure WriteCryptedPreferenceQuad(Key.s, Value.q)
	
	Shared CryptedPreferences.CryptedPreferences
	
	Select GetCryptedPreferencesStyle(CryptedPreferences)
			
		Case #CRYPTED_PREFERENCES_STYLE_EVERYTHING
			OutKey.s = PukallCipherEncrypt(GetCryptedPreferencesNormalizedKey(CryptedPreferences), Key, GetCryptedPreferencesLevel(CryptedPreferences))
			OutValue.s = PukallCipherEncrypt(GetCryptedPreferencesNormalizedKey(CryptedPreferences), Str(Value), GetCryptedPreferencesLevel(CryptedPreferences))
			
		Case #CRYPTED_PREFERENCES_STYLE_VALUE_ONLY
			OutKey.s = Key
			OutValue.s = PukallCipherEncrypt(GetCryptedPreferencesNormalizedKey(CryptedPreferences), Str(Value), GetCryptedPreferencesLevel(CryptedPreferences))
			
	EndSelect 
	
	WritePreferenceString(OutKey, OutValue)
	
EndProcedure 

Procedure WriteCryptedPreferenceFloat(Key.s, Value.f)
	
	Shared CryptedPreferences.CryptedPreferences
	
	Select GetCryptedPreferencesStyle(CryptedPreferences)
			
		Case #CRYPTED_PREFERENCES_STYLE_EVERYTHING
			OutKey.s = PukallCipherEncrypt(GetCryptedPreferencesNormalizedKey(CryptedPreferences), Key, GetCryptedPreferencesLevel(CryptedPreferences))
			OutValue.s = PukallCipherEncrypt(GetCryptedPreferencesNormalizedKey(CryptedPreferences), StrF(Value, 6), GetCryptedPreferencesLevel(CryptedPreferences))
			
		Case #CRYPTED_PREFERENCES_STYLE_VALUE_ONLY
			OutKey.s = Key
			OutValue.s = PukallCipherEncrypt(GetCryptedPreferencesNormalizedKey(CryptedPreferences), StrF(Value, 6), GetCryptedPreferencesLevel(CryptedPreferences))
			
	EndSelect 
	
	WritePreferenceString(OutKey, OutValue)
	
EndProcedure 

Procedure WriteCryptedPreferenceDouble(Key.s, Value.d)
	
	Shared CryptedPreferences.CryptedPreferences
	
	Select GetCryptedPreferencesStyle(CryptedPreferences)
			
		Case #CRYPTED_PREFERENCES_STYLE_EVERYTHING
			OutKey.s = PukallCipherEncrypt(GetCryptedPreferencesNormalizedKey(CryptedPreferences), Key, GetCryptedPreferencesLevel(CryptedPreferences))
			OutValue.s = PukallCipherEncrypt(GetCryptedPreferencesNormalizedKey(CryptedPreferences), StrD(Value, 12), GetCryptedPreferencesLevel(CryptedPreferences))
			
		Case #CRYPTED_PREFERENCES_STYLE_VALUE_ONLY
			OutKey.s = Key
			OutValue.s = PukallCipherEncrypt(GetCryptedPreferencesNormalizedKey(CryptedPreferences), StrD(Value, 12), GetCryptedPreferencesLevel(CryptedPreferences))
			
	EndSelect 
	
	WritePreferenceString(OutKey, OutValue)
	
EndProcedure 

Procedure WriteCryptedPreferenceString(Key.s, Value.s)
	
	Shared CryptedPreferences.CryptedPreferences
	
	Select GetCryptedPreferencesStyle(CryptedPreferences)
			
		Case #CRYPTED_PREFERENCES_STYLE_EVERYTHING
			OutKey.s = PukallCipherEncrypt(GetCryptedPreferencesNormalizedKey(CryptedPreferences), Key, GetCryptedPreferencesLevel(CryptedPreferences))
			OutValue.s = PukallCipherEncrypt(GetCryptedPreferencesNormalizedKey(CryptedPreferences), Value, GetCryptedPreferencesLevel(CryptedPreferences))
			
		Case #CRYPTED_PREFERENCES_STYLE_VALUE_ONLY
			OutKey.s = Key
			OutValue.s = PukallCipherEncrypt(GetCryptedPreferencesNormalizedKey(CryptedPreferences), Value, GetCryptedPreferencesLevel(CryptedPreferences))
			
	EndSelect 
	
	WritePreferenceString(OutKey, OutValue)
	
EndProcedure 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Les opérateurs ReadCryptedPreference <<<<<

Procedure.l ReadCryptedPreferenceLong(Key.s, Value.l)
	
	Shared CryptedPreferences.CryptedPreferences
	
	Select GetCryptedPreferencesStyle(CryptedPreferences)
			
		Case #CRYPTED_PREFERENCES_STYLE_EVERYTHING
			OutKey.s = PukallCipherEncrypt(GetCryptedPreferencesNormalizedKey(CryptedPreferences), Key, GetCryptedPreferencesLevel(CryptedPreferences))
			OutValue.s = PukallCipherEncrypt(GetCryptedPreferencesNormalizedKey(CryptedPreferences), Str(Value), GetCryptedPreferencesLevel(CryptedPreferences))
			
		Case #CRYPTED_PREFERENCES_STYLE_VALUE_ONLY
			OutKey.s = Key
			OutValue.s = PukallCipherEncrypt(GetCryptedPreferencesNormalizedKey(CryptedPreferences), Str(Value), GetCryptedPreferencesLevel(CryptedPreferences))
			
	EndSelect 
	
	ReturnValue.l = Val(PukallCipherDecrypt(GetCryptedPreferencesNormalizedKey(CryptedPreferences), ReadPreferenceString(OutKey, OutValue), GetCryptedPreferencesLevel(CryptedPreferences)))
	
	ProcedureReturn ReturnValue
EndProcedure 

Procedure.i ReadCryptedPreferenceInteger(Key.s, Value.i)
	
	Shared CryptedPreferences.CryptedPreferences
	
	Select GetCryptedPreferencesStyle(CryptedPreferences)
			
		Case #CRYPTED_PREFERENCES_STYLE_EVERYTHING
			OutKey.s = PukallCipherEncrypt(GetCryptedPreferencesNormalizedKey(CryptedPreferences), Key, GetCryptedPreferencesLevel(CryptedPreferences))
			OutValue.s = PukallCipherEncrypt(GetCryptedPreferencesNormalizedKey(CryptedPreferences), Str(Value), GetCryptedPreferencesLevel(CryptedPreferences))
			
		Case #CRYPTED_PREFERENCES_STYLE_VALUE_ONLY
			OutKey.s = Key
			OutValue.s = PukallCipherEncrypt(GetCryptedPreferencesNormalizedKey(CryptedPreferences), Str(Value), GetCryptedPreferencesLevel(CryptedPreferences))
			
	EndSelect 
	
	ReturnValue.i = Val(PukallCipherDecrypt(GetCryptedPreferencesNormalizedKey(CryptedPreferences), ReadPreferenceString(OutKey, OutValue), GetCryptedPreferencesLevel(CryptedPreferences)))
	
	ProcedureReturn ReturnValue
EndProcedure 

Procedure.q ReadCryptedPreferenceQuad(Key.s, Value.q)
	
	Shared CryptedPreferences.CryptedPreferences
	
	Select GetCryptedPreferencesStyle(CryptedPreferences)
			
		Case #CRYPTED_PREFERENCES_STYLE_EVERYTHING
			OutKey.s = PukallCipherEncrypt(GetCryptedPreferencesNormalizedKey(CryptedPreferences), Key, GetCryptedPreferencesLevel(CryptedPreferences))
			OutValue.s = PukallCipherEncrypt(GetCryptedPreferencesNormalizedKey(CryptedPreferences), Str(Value), GetCryptedPreferencesLevel(CryptedPreferences))
			
		Case #CRYPTED_PREFERENCES_STYLE_VALUE_ONLY
			OutKey.s = Key
			OutValue.s = PukallCipherEncrypt(GetCryptedPreferencesNormalizedKey(CryptedPreferences), Str(Value), GetCryptedPreferencesLevel(CryptedPreferences))
			
	EndSelect 
	
	ReturnValue.q = Val(PukallCipherDecrypt(GetCryptedPreferencesNormalizedKey(CryptedPreferences), ReadPreferenceString(OutKey, OutValue), GetCryptedPreferencesLevel(CryptedPreferences)))
	
	ProcedureReturn ReturnValue
EndProcedure 

Procedure.f ReadCryptedPreferenceFloat(Key.s, Value.f)
	
	Shared CryptedPreferences.CryptedPreferences
	
	Select GetCryptedPreferencesStyle(CryptedPreferences)
			
		Case #CRYPTED_PREFERENCES_STYLE_EVERYTHING
			OutKey.s = PukallCipherEncrypt(GetCryptedPreferencesNormalizedKey(CryptedPreferences), Key, GetCryptedPreferencesLevel(CryptedPreferences))
			OutValue.s = PukallCipherEncrypt(GetCryptedPreferencesNormalizedKey(CryptedPreferences), Str(Value), GetCryptedPreferencesLevel(CryptedPreferences))
			
		Case #CRYPTED_PREFERENCES_STYLE_VALUE_ONLY
			OutKey.s = Key
			OutValue.s = PukallCipherEncrypt(GetCryptedPreferencesNormalizedKey(CryptedPreferences), Str(Value), GetCryptedPreferencesLevel(CryptedPreferences))
			
	EndSelect 
	
	ReturnValue.f = ValF(PukallCipherDecrypt(GetCryptedPreferencesNormalizedKey(CryptedPreferences), ReadPreferenceString(OutKey, OutValue), GetCryptedPreferencesLevel(CryptedPreferences)))
	
	ProcedureReturn ReturnValue
EndProcedure 

Procedure.d ReadCryptedPreferenceDouble(Key.s, Value.d)
	
	Shared CryptedPreferences.CryptedPreferences
	
	Select GetCryptedPreferencesStyle(CryptedPreferences)
			
		Case #CRYPTED_PREFERENCES_STYLE_EVERYTHING
			OutKey.s = PukallCipherEncrypt(GetCryptedPreferencesNormalizedKey(CryptedPreferences), Key, GetCryptedPreferencesLevel(CryptedPreferences))
			OutValue.s = PukallCipherEncrypt(GetCryptedPreferencesNormalizedKey(CryptedPreferences), Str(Value), GetCryptedPreferencesLevel(CryptedPreferences))
			
		Case #CRYPTED_PREFERENCES_STYLE_VALUE_ONLY
			OutKey.s = Key
			OutValue.s = PukallCipherEncrypt(GetCryptedPreferencesNormalizedKey(CryptedPreferences), Str(Value), GetCryptedPreferencesLevel(CryptedPreferences))
			
	EndSelect 
	
	ReturnValue.d = ValD(PukallCipherDecrypt(GetCryptedPreferencesNormalizedKey(CryptedPreferences), ReadPreferenceString(OutKey, OutValue), GetCryptedPreferencesLevel(CryptedPreferences)))
	
	ProcedureReturn ReturnValue
EndProcedure 

Procedure.s ReadCryptedPreferenceString(Key.s, Value.s)
	
	Shared CryptedPreferences.CryptedPreferences
	
	Select GetCryptedPreferencesStyle(CryptedPreferences)
			
		Case #CRYPTED_PREFERENCES_STYLE_EVERYTHING
			OutKey.s = PukallCipherEncrypt(GetCryptedPreferencesNormalizedKey(CryptedPreferences), Key, GetCryptedPreferencesLevel(CryptedPreferences))
			OutValue.s = PukallCipherEncrypt(GetCryptedPreferencesNormalizedKey(CryptedPreferences), Value, GetCryptedPreferencesLevel(CryptedPreferences))
			
		Case #CRYPTED_PREFERENCES_STYLE_VALUE_ONLY
			OutKey.s = Key
			OutValue.s = PukallCipherEncrypt(GetCryptedPreferencesNormalizedKey(CryptedPreferences), Value, GetCryptedPreferencesLevel(CryptedPreferences))
			
	EndSelect 
	
	ReturnValue.s = PukallCipherDecrypt(GetCryptedPreferencesNormalizedKey(CryptedPreferences), ReadPreferenceString(OutKey, OutValue), GetCryptedPreferencesLevel(CryptedPreferences))
	
	ProcedureReturn ReturnValue
EndProcedure 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur CryptedPreferenceGroup <<<<<

Procedure CryptedPreferenceGroup(Name.s)
	
	Shared CryptedPreferences.CryptedPreferences
	
	Select GetCryptedPreferencesStyle(CryptedPreferences)
			
		Case #CRYPTED_PREFERENCES_STYLE_EVERYTHING
			OutName.s = PukallCipherEncrypt(GetCryptedPreferencesNormalizedKey(CryptedPreferences), Name, GetCryptedPreferencesLevel(CryptedPreferences))

		Case #CRYPTED_PREFERENCES_STYLE_VALUE_ONLY
			OutName.s = Name

	EndSelect 
	
	PreferenceGroup(OutName)
	
EndProcedure 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur CryptedPreferenceGroupName <<<<<

Procedure.s CryptedPreferenceGroupName()
	
	Shared CryptedPreferences.CryptedPreferences
	
	Select GetCryptedPreferencesStyle(CryptedPreferences)
			
		Case #CRYPTED_PREFERENCES_STYLE_EVERYTHING
			OutName.s = PukallCipherEncrypt(GetCryptedPreferencesNormalizedKey(CryptedPreferences), PreferenceGroupName(), GetCryptedPreferencesLevel(CryptedPreferences))

		Case #CRYPTED_PREFERENCES_STYLE_VALUE_ONLY
			OutName.s = PreferenceGroupName()

	EndSelect 
	
	ProcedureReturn OutName
EndProcedure 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur CryptedPreferenceKeyName <<<<<

Procedure.s CryptedPreferenceKeyName()
	
	Shared CryptedPreferences.CryptedPreferences
	
	Select GetCryptedPreferencesStyle(CryptedPreferences)
			
		Case #CRYPTED_PREFERENCES_STYLE_EVERYTHING
			OutName.s = PukallCipherEncrypt(GetCryptedPreferencesNormalizedKey(CryptedPreferences), PreferenceKeyName(), GetCryptedPreferencesLevel(CryptedPreferences))

		Case #CRYPTED_PREFERENCES_STYLE_VALUE_ONLY
			OutName.s = PreferenceKeyName()

	EndSelect 
	
	ProcedureReturn OutName
EndProcedure 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur CryptedPreferenceKeyValue <<<<<

Procedure.s CryptedPreferenceKeyValue()
	
	Shared CryptedPreferences.CryptedPreferences
	
	Select GetCryptedPreferencesStyle(CryptedPreferences)
			
		Case #CRYPTED_PREFERENCES_STYLE_EVERYTHING
			OutName.s = PukallCipherEncrypt(GetCryptedPreferencesNormalizedKey(CryptedPreferences), PreferenceKeyValue(), GetCryptedPreferencesLevel(CryptedPreferences))

		Case #CRYPTED_PREFERENCES_STYLE_VALUE_ONLY
			OutName.s = PreferenceKeyValue()

	EndSelect 
	
	ProcedureReturn OutName
EndProcedure 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur CryptedRemovePreferenceKey <<<<<

Procedure CryptedRemovePreferenceKey(Key.s)
	
	Shared CryptedPreferences.CryptedPreferences
	
	Select GetCryptedPreferencesStyle(CryptedPreferences)
			
		Case #CRYPTED_PREFERENCES_STYLE_EVERYTHING
			OutKey.s = PukallCipherEncrypt(GetCryptedPreferencesNormalizedKey(CryptedPreferences), Key, GetCryptedPreferencesLevel(CryptedPreferences))

		Case #CRYPTED_PREFERENCES_STYLE_VALUE_ONLY
			OutKey.s = Key

	EndSelect 
	
	RemovePreferenceKey(OutKey)
	
EndProcedure 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur CryptedPreferenceComment <<<<<

Procedure CryptedPreferenceComment(Text.s)
	
	Shared CryptedPreferences.CryptedPreferences
	
	Select GetCryptedPreferencesStyle(CryptedPreferences)
			
		Case #CRYPTED_PREFERENCES_STYLE_EVERYTHING
			OutName.s = PukallCipherEncrypt(GetCryptedPreferencesNormalizedKey(CryptedPreferences), Text, GetCryptedPreferencesLevel(CryptedPreferences))

		Case #CRYPTED_PREFERENCES_STYLE_VALUE_ONLY
			OutName.s = Text

	EndSelect 
	
	PreferenceComment(OutName)
	
EndProcedure 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur Initialize <<<<<

Procedure InitializeCryptedPreferences(P_Style.l, P_Password.s, P_Level.l)

	Shared CryptedPreferences.CryptedPreferences
	
	SetCryptedPreferencesStyle(CryptedPreferences, P_Style)
	SetCryptedPreferencesPassword(CryptedPreferences, P_Password)
	SetCryptedPreferencesLevel(CryptedPreferences, P_Level)
	SetCryptedPreferencesNormalizedKey(CryptedPreferences, PukallCipherNormalizedKey(GetCryptedPreferencesPassword(CryptedPreferences), GetCryptedPreferencesLevel(CryptedPreferences)))
	
EndProcedure 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Ajustement du Style <<<<<

Procedure CryptedPreferencesStyle(P_Style.l)
	
	Shared CryptedPreferences.CryptedPreferences
	
	SetCryptedPreferencesStyle(CryptedPreferences, P_Style)

EndProcedure 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Ajustement du Password <<<<<

Procedure CryptedPreferencesPassword(P_Password.s)
	
	Shared CryptedPreferences.CryptedPreferences
	
	; Si le niveau de cryptage n'est pas spécifié, on l'ajuste à 128 bits par défaut.
	
	If GetCryptedPreferencesLevel(CryptedPreferences) = 0
		SetCryptedPreferencesLevel(CryptedPreferences, #PUKALLCIPHER_LEVEL_GOOD)
	EndIf 
	
	SetCryptedPreferencesPassword(CryptedPreferences, P_Password)
	SetCryptedPreferencesNormalizedKey(CryptedPreferences, PukallCipherNormalizedKey(GetCryptedPreferencesPassword(CryptedPreferences), GetCryptedPreferencesLevel(CryptedPreferences)))
	
EndProcedure 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Ajustement du Level <<<<<

Procedure CryptedPreferencesLevel(P_Level.l)
	
	Shared CryptedPreferences.CryptedPreferences
	
	; Si le niveau de cryptage est différent de celui déja initialisé, on change la valeur 
	; et si le mot de passe est non null on re-normalise la clé de cryptage.
	
	If P_level <> GetCryptedPreferencesLevel(CryptedPreferences)
		
		SetCryptedPreferencesLevel(CryptedPreferences, P_Level)
		
		If GetCryptedPreferencesPassword(CryptedPreferences) <> ""
			SetCryptedPreferencesNormalizedKey(CryptedPreferences, PukallCipherNormalizedKey(GetCryptedPreferencesPassword(CryptedPreferences), GetCryptedPreferencesLevel(CryptedPreferences)))
		EndIf 
		
	EndIf 
	
EndProcedure 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur CreateCryptedPreferences <<<<<

Procedure.b CreateCryptedPreferences(FileName.s)
	
	Shared CryptedPreferences.CryptedPreferences
	
	Success.b = #False
	
	If CreatePreferences(FileName)
		
		Select GetCryptedPreferencesStyle(CryptedPreferences)
				
			Case #CRYPTED_PREFERENCES_STYLE_EVERYTHING
				Key.s = PukallCipherEncrypt(GetCryptedPreferencesNormalizedKey(CryptedPreferences), "FailSafe", GetCryptedPreferencesLevel(CryptedPreferences))
				Value.s = PukallCipherEncrypt(GetCryptedPreferencesNormalizedKey(CryptedPreferences), "CRYPTED_PREFERENCES", GetCryptedPreferencesLevel(CryptedPreferences))
				
			Case #CRYPTED_PREFERENCES_STYLE_VALUE_ONLY
				Key.s = "FailSafe"
				Value.s = PukallCipherEncrypt(GetCryptedPreferencesNormalizedKey(CryptedPreferences), "CRYPTED_PREFERENCES", GetCryptedPreferencesLevel(CryptedPreferences))
				
		EndSelect 
		
		WritePreferenceString(Key, Value)
		Success.b = #True
		
	EndIf 
	
	ProcedureReturn Success
EndProcedure 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur OpenCryptedPreferences <<<<<

Procedure.b OpenCryptedPreferences(FileName.s)
	
	Shared CryptedPreferences.CryptedPreferences
	
	Success.b = #False
	
	If OpenPreferences(FileName)
		
		If ExaminePreferenceKeys()
			
			NextPreferenceKey()
			InKey.s = PreferenceKeyName()
			InValue.s = PreferenceKeyValue()

			Select GetCryptedPreferencesStyle(CryptedPreferences)
					
				Case #CRYPTED_PREFERENCES_STYLE_EVERYTHING
					Key.s = PukallCipherDecrypt(GetCryptedPreferencesNormalizedKey(CryptedPreferences), InKey, GetCryptedPreferencesLevel(CryptedPreferences))
					Value.s = PukallCipherDecrypt(GetCryptedPreferencesNormalizedKey(CryptedPreferences), InValue, GetCryptedPreferencesLevel(CryptedPreferences))
					
				Case #CRYPTED_PREFERENCES_STYLE_VALUE_ONLY
					Key.s = "FailSafe"
					Value.s = PukallCipherDecrypt(GetCryptedPreferencesNormalizedKey(CryptedPreferences), InValue, GetCryptedPreferencesLevel(CryptedPreferences))
					
			EndSelect 
			
			; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
			; Si la clé "FailSafe" et sa valeur "CRYPTED_PREFERENCES" sont identiques
			; aux valeurs par défaut cela implique que le mot de passe est correct. 
			; Donc on signale que l'ouverture est un succès pour la suite de la lecture.
			; Si non on demande à nouveau le mot de passe et on fait un autre essai.
			
			If Key = "FailSafe" And Value = "CRYPTED_PREFERENCES"
				Success.b = #True 
			EndIf 
			
		EndIf 
		
	EndIf   
	
	ProcedureReturn Success
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur CloseCryptedPreferences <<<<<

Procedure CloseCryptedPreferences()
	
	Shared CryptedPreferences.CryptedPreferences
	
	ResetCryptedPreferences(CryptedPreferences)
	ClosePreferences()
	
EndProcedure 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< !!! ATTENTION - CODE D'ESSAI !!! <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

InitializeCryptedPreferences(#CRYPTED_PREFERENCES_STYLE_EVERYTHING, "ns40@eby$xwq#", #PUKALLCIPHER_LEVEL_LUDICROUS)
; CryptedPreferencesStyle(#CRYPTED_PREFERENCES_STYLE_EVERYTHING)
; CryptedPreferencesLevel(#PUKALLCIPHER_LEVEL_LUDICROUS)
; CryptedPreferencesPassword("ns40@eby£xwq#")

If CreateCryptedPreferences("Test.pref")
	
	CryptedPreferenceComment("Un commentaire juste pour voir ce que ça donne !")
	CryptedPreferenceGroup("Entier")
	WriteCryptedPreferenceLong("Long", 65535)
	WriteCryptedPreferenceQuad("Quad", 65535)
	CryptedPreferenceGroup("Réel")
	WriteCryptedPreferenceFloat("Float", #PI)
	WriteCryptedPreferenceDouble("Double", 2 * #PI)
	CryptedPreferenceGroup("Texte")
	WriteCryptedPreferenceString("String", "Std Preferences Wrapping")
	
	CloseCryptedPreferences()
	
EndIf

CryptedPreferencesStyle(#CRYPTED_PREFERENCES_STYLE_EVERYTHING)
CryptedPreferencesPassword("@£¢12acwerd%&")
CryptedPreferencesLevel(#PUKALLCIPHER_LEVEL_LUDICROUS)

For Try = 0 To 3
	
	If OpenCryptedPreferences("Test.pref")
		
		CryptedPreferenceGroup("Entier")
		Debug ReadCryptedPreferenceLong("Long", 0)
		Debug ReadCryptedPreferenceQuad("Quad", 0)
		CryptedPreferenceGroup("Réel")
		Debug ReadCryptedPreferenceFloat("Float", 0.0)
		Debug ReadCryptedPreferenceDouble("Double", 0.0)
		CryptedPreferenceGroup("Texte")
		Debug ReadCryptedPreferenceString("String", "")
		
		CloseCryptedPreferences()
		Break
		
	ElseIf Try = 2
		
		CryptedPreferencesPassword("ns40@eby$xwq#")
		
	Else
		
		Debug "Wrong Password !"
		
	EndIf
	
Next

; <<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< FIN DU FICHIER <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<
Répondre