CryptedPreferences

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

CryptedPreferences

Message par Guimauve »

Bonjour à tous,

Je me suis un peu amusé cet après-midi à combiner la libraire standard Préférences de PB avec l'algorithme PukallCipher et voici le prototype résultant.
Le code est sur deux fichiers, désolé...

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 <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<
A+
Guimauve