Page 1 sur 2

Besoin de conseils pour fignoler mon crypteur

Publié : jeu. 17/mars/2016 18:24
par SPH
Lut tous !!

J'ai fais un crypteur/decrypteur et je cherche a faire la carrosserie de ma procedure. Il crypte/decrypte selon la valeur de "CRYPT".
J'ai regardé la doc pour faire du canvas mais j'ai pas compris :

Code : Tout sélectionner

UseMD5Fingerprint()
;Beep_(1500,150)
; --- reserve de nombres aleatoires ---
Dim r.q(1000)
For i=0 To 1000
  cmb=Random(40)
  For u=0 To cmb
    r(i)+ Random(65536*32768-1)
   ; Debug r(i)    
  Next
  ;Debug("---")
Next
new=0
;Beep_(1500,150)

Beep_(500,150)


debut:

b.b=0
mdp$="SPH2016"


; c'est ici que se decide si on crypte ou on decrypte :
; 0 = crypter
; 1 = decrypter
crypt=0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


If crypt=0
  a$="crypter"
Else
  a$="décrypter"
EndIf


  Fichier$ = OpenFileRequester("Choisissez un fichier à "+a$, "*.*", "*.*", 0)
  ;Fichier$ = "c:\HexaScrabble2\HexaScrabble.exe"
  If Fichier$
    ReadFile(0, Fichier$)
    ;b.b=ReadByte(0)
    ;Debug b
  Fichier2$ = OpenFileRequester("Choisissez un fichier à sauvegarder", "*.*", "*.*", 0)
  If Fichier2$ And Fichier$<>Fichier2$
    CreateFile(1, Fichier2$)
    
    
    

;-------------stockage des bits--------------

len=Len(mdp$)
Dim bit.b(len*8)
For i=1 To len
  a$=Mid(mdp$,i,1)
  For u=0 To 7
   bit((i-1)*8+u+1) = (Asc(a$)>>u)%2
   ;Debug bit((i-1)*8+u+1)
   Next
Next


;---calcul de total---
x.q=1
total.q=0
For i=1 To Len(mdp$)
mid$=Mid(mdp$,i,1)
total+Asc(mid$)*x
If x>=65536*65536*65536
x=1
Else
x*2
EndIf
Next
Debug total


;------------------calcul de md5$ et de md5--------------------
md5$= StringFingerprint(mdp$, #PB_Cipher_MD5)
Debug md5$
md5=0
For i=1 To Len(md5$)
mid$=Mid(md5$,i,1)
md5+Asc(mid$)
Next
Debug md5


;-------------------creation de dim octet et du premier octet-------------------
Dim octet.b(600)

If crypt=0
For i=0 To 600
  octet(i)=Random(255)+Random(255)+Random(256)+Random(254)+Random(250)+Random(260)  
Next
Else
  For i=0 To 9
  octet(i)=ReadByte(0)
Next
EndIf


bit4.b=total+md5+octet(0)+octet(1)+octet(2)+octet(3)+octet(4)+octet(5)+octet(6)+octet(7)+octet(8)+octet(9)
Debug bit4
bit4w.w=10+bit4&%00001111
Debug bit4w

octet(bit4w)=bit4


;--------------------
mdp_2=0
md5_2=0
tot_2=0
tot2_2=0
tot3_2=0

For  u=1 To 32
  
md5$+ StringFingerprint(mdp$+Str(bit4), #PB_Cipher_MD5)

Debug md5$
md5=0
For i=1 To Len(md5$)
mid$=Mid(md5$,i,1)
md5+Asc(mid$)
Next
Debug md5

bit4.b=total+md5
Debug bit4
bit4w.w+1+bit4&%00001111
Debug bit4w

If u<=10
  mdp_2+bit4w
EndIf
If u<=21
  md5_2+bit4w
EndIf
If u<=32
  tot_2+bit4w
EndIf
If u<=24
  tot2_2+bit4w
EndIf
If u>=22
  tot3_2+bit4w
EndIf

octet(bit4w)=bit4

Next


;--------------------
If crypt=0
Debug "===="
For i=0 To bit4w
  b.b=octet(i) 
  ;Debug b
  WriteByte(1,b)
Next
Else
  If Lof(0)>=bit4w+1
    FileSeek(0, bit4w+1) 
  Else
    MessageRequester("Information","Fichier trop petit !")
    Goto fin
  EndIf
EndIf


TempsDepart = ElapsedMilliseconds()


;mdp$, total, md5$, octet(), bit()

RandomSeed(total)
len*8
len2=1

While Eof(0) = 0
  b.b=ReadByte(0)
  
  b=b!Random(255)
  b=b!Random(255)
  b=b!Random(255)
  b=b!Random(255)
  b=b!Random(255)
  b=b!Random(255)
  b=b!Random(255)
  
  If bit(len2)=0
  b=b!Random(255)
  b=b!Random(255)
  b=b!Random(255)
  b=b!Random(255)
  EndIf
  
  
  While mdp_2>Len(mdp$)
    mdp_2-Len(mdp$)
  Wend
  a$=Mid(mdp$,mdp_2,1)
  b=b!Asc(a$)
  deca2=Asc(a$)&%00000011
  mdp_2+1
  
    
  While md5_2>Len(md5$)
    md5_2-Len(md5$)
  Wend
  a$=Mid(md5$,md5_2,1)
  b=b!Asc(a$)
  deca=Asc(a$)&%00000011
  md5_2+1
  
  
  While tot_2>Len(Str(total))
    tot_2-Len(Str(total))
  Wend
  a$=Mid(Str(total),tot_2,1)
  b=b!Asc(a$)
  tot_2+1
  
  
  While tot2_2>Len(mdp$)
    tot2_2-Len(mdp$)
  Wend
  a$=Mid(mdp$,tot2_2,1)
  b=b!(Asc(a$)<<deca)
  tot2_2+1
  
  
  While tot3_2>Len(md5$)
    tot3_2-Len(md5$)
  Wend
  a$=Mid(md5$,tot3_2,1)
  b=b!(Asc(a$)<<deca2)
  tot3_2+1
  
  
  ; -------------------- bit de poids fort
  b!(bit(len2)*128)
  len2+1
  If len2>len
    len2=1
  EndIf
  
  
WriteByte(1,b)
Wend

fin:
CloseFile(0)
CloseFile(1)
RandomSeed(r(new))
new+1

TempsEcoule = ElapsedMilliseconds()-TempsDepart
Debug "Temps écoulé : "+Str(TempsEcoule)+" millisecondes" 


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;fin;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   Else
     MessageRequester("Information","Impossible d'ouvrir le fichier!")
     End
   EndIf
 EndIf
 
 
     
     
     For i=1 To 3
       Beep_(1500,90)
       Delay(50)
     Next
     
          MessageRequester("Information","Temps écoulé : "+Str(TempsEcoule)+" millisecondes")

     End
     
     Goto debut
     
     

Re: Besoin de conseils pour fignoler mon crypteur

Publié : jeu. 17/mars/2016 20:08
par SPH
Spock a écrit :

Code : Tout sélectionner



procedure Crypt ( password.s,mode )
; initialisation ici 
	
	select mode
		case 0 		
		; ici le code pour crypter	
		Case 1 		
		; ici le code pour decrypter
		
	EndSelect
	
	ProcedureReturn Etat ; retourne un code d'etat pour savoir si ça c'est bien passé
EndProcedure
; Epb

Je m'interroge... Je ne veux pas repeter 2 fois mon code (une fois dans CASE1 et une fois dans CASE2)

Je ne sais meme pas si je debute bien :

Code : Tout sélectionner



procedure Crypt ( password.s,mode )
; initialisation ici 
	
	select mode
		case 0 		
		; ici le code pour crypter
                  crypt=0	
		Case 1 		
		; ici le code pour decrypter
		  crypt=1
	EndSelect
	
	ProcedureReturn Etat ; retourne un code d'etat pour savoir si ça c'est bien passé
EndProcedure
; Epb
Je le met ou mon code ?

(jamais utilisé les CASE)

Re: Besoin de conseils pour fignoler mon crypteur

Publié : jeu. 17/mars/2016 20:51
par SPH
Ha ok, j'y vois plus claire. Merciii 8)

Re: Besoin de conseils pour fignoler mon crypteur

Publié : jeu. 17/mars/2016 23:09
par Ar-S
Tu ne vas pas laisser : password.s ="mot de pass" en claire dans l'exe si ?

Re: Besoin de conseils pour fignoler mon crypteur

Publié : ven. 18/mars/2016 13:05
par SPH
Ar-S a écrit :Tu ne vas pas laisser : password.s ="mot de pass" en claire dans l'exe si ?
Non, le password, il faudra le renseigner dans un champ PASSWORD :idea:

Re: Besoin de conseils pour fignoler mon crypteur

Publié : ven. 18/mars/2016 13:16
par falsam
Hello SPH.

Mise à part ta façon de coder à l'ancienne, j'aime bien ton code. :wink:

Les gadgets et les procédures tu ne connais pas et tu t'en sors plutôt bien. Mais tu sais que PureBasic est évolué ?

Remplace

Code : Tout sélectionner

OpenFileRequester("Choisissez un fichier à sauvegarder", "*.*", "*.*", 0)
par

Code : Tout sélectionner

SaveFileRequester("Choisissez un fichier à sauvegarder", "", "*.*", 0)

Re: Besoin de conseils pour fignoler mon crypteur

Publié : ven. 18/mars/2016 15:07
par falsam
SPH a écrit :J'ai fais un crypteur/decrypteur et je cherche a faire la carrosserie de ma procedure. ... J'ai regardé la doc pour faire du canvas mais j'ai pas compris :
je ne sais pas quel idée tu as dans la tête, mais un canvas pour ça ne sert à rien.

Un exemple de carrosserie de ta procédure.

Code : Tout sélectionner

Enumeration Window
  #MainForm
EndEnumeration

Enumeration Gadget
  #Function
  #Password 
  #Run
EndEnumeration

Global Dim r.q(1000), New.i

Declare Reserve()
Declare Debut()


Reserve()
Debut()

; --- reserve de nombres aleatoires ---
Procedure Reserve()
  Protected cmb.i, i
  
  For i=0 To 1000
    cmb=Random(40)
    For u=0 To cmb
      r(i)+ Random(65536*32768-1)
    Next
  Next
  new=0
  
  Beep_(500,150)
EndProcedure

Procedure Debut()
  Protected b.b = 0
  UseMD5Fingerprint()
  
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  OpenWindow(#MainForm, 0, 0, 280, 150, "Cryptage & Décrypage de données", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  
  TextGadget(#PB_Any, 10, 20, 100, 22, "Fonction")
  ComboBoxGadget(#Function, 110, 20, 150, 22)
  AddGadgetItem(#Function, -1, "Crypter")
  AddGadgetItem(#Function, -1, "Décrypter")
  SetGadgetState(#Function, 0) ;Se positionner sur le premier élement
  
  TextGadget(#PB_Any, 10, 50, 100, 22, "Mot de passe")
  StringGadget(#Password, 110, 50, 150, 22, "1234")
  
  ButtonGadget(#Run, 108, 103, 80, 25, "Go")
  
  Repeat
    Select WaitWindowEvent(10)
      Case #PB_Event_Gadget ;Evenement sur un gadget 
        If EventGadget() = #Run
          
          ; c'est ici que se decide si on crypte ou on decrypte :
          crypt = GetGadgetState(#Function) ; 0 = crypter 1 = decrypter
          mdp$  = GetGadgetText(#Password)
          
          If crypt=0
            a$="crypter"
          Else
            a$="décrypter"
          EndIf
          
          If Len(mdp$) <> 0
            
            Fichier$ = OpenFileRequester("Choisissez un fichier à "+a$, "*.*", "*.*", 0)
            
            If Fichier$
              ReadFile(0, Fichier$)
              ;b.b=ReadByte(0)
              ;Debug b
              Fichier2$ = SaveFileRequester("Choisissez un fichier à sauvegarder", "", "*.*", 0)
              If Fichier2$ And Fichier$<>Fichier2$
                CreateFile(1, Fichier2$)
                
                ;-------------stockage des bits--------------          
                len=Len(mdp$)
                Dim bit.b(len*8)
                For i=1 To len
                  a$=Mid(mdp$,i,1)
                  For u=0 To 7
                    bit((i-1)*8+u+1) = (Asc(a$)>>u)%2
                    ;Debug bit((i-1)*8+u+1)
                  Next
                Next
                
                ;---calcul de total---
                x.q=1
                total.q=0
                For i=1 To Len(mdp$)
                  mid$=Mid(mdp$,i,1)
                  total+Asc(mid$)*x
                  If x>=65536*65536*65536
                    x=1
                  Else
                    x*2
                  EndIf
                Next
                Debug total
                
                ;------------------calcul de md5$ et de md5--------------------
                md5$= StringFingerprint(mdp$, #PB_Cipher_MD5)
                Debug md5$
                md5=0
                For i=1 To Len(md5$)
                  mid$=Mid(md5$,i,1)
                  md5+Asc(mid$)
                Next
                Debug md5
                
                ;-------------------creation de dim octet et du premier octet-------------------
                Dim octet.b(600)
                
                If crypt=0
                  For i=0 To 600
                    octet(i)=Random(255)+Random(255)+Random(256)+Random(254)+Random(250)+Random(260)  
                  Next
                Else
                  For i=0 To 9
                    octet(i)=ReadByte(0)
                  Next
                EndIf
                
                
                bit4.b=total+md5+octet(0)+octet(1)+octet(2)+octet(3)+octet(4)+octet(5)+octet(6)+octet(7)+octet(8)+octet(9)
                Debug bit4
                bit4w.w=10+bit4&%00001111
                Debug bit4w
                
                octet(bit4w)=bit4
                
                ;--------------------
                mdp_2=0
                md5_2=0
                tot_2=0
                tot2_2=0
                tot3_2=0
                
                For  u=1 To 32
                  
                  md5$+ StringFingerprint(mdp$+Str(bit4), #PB_Cipher_MD5)
                  
                  Debug md5$
                  md5=0
                  For i=1 To Len(md5$)
                    mid$=Mid(md5$,i,1)
                    md5+Asc(mid$)
                  Next
                  Debug md5
                  
                  bit4.b=total+md5
                  Debug bit4
                  bit4w.w+1+bit4&%00001111
                  Debug bit4w
                  
                  If u<=10
                    mdp_2+bit4w
                  EndIf
                  If u<=21
                    md5_2+bit4w
                  EndIf
                  If u<=32
                    tot_2+bit4w
                  EndIf
                  If u<=24
                    tot2_2+bit4w
                  EndIf
                  If u>=22
                    tot3_2+bit4w
                  EndIf
                  
                  octet(bit4w)=bit4
                  
                Next
                
                ;--------------------
                If crypt=0
                  Debug "===="
                  For i=0 To bit4w
                    b.b=octet(i) 
                    ;Debug b
                    WriteByte(1,b)
                  Next
                Else
                  If Lof(0)>=bit4w+1
                    FileSeek(0, bit4w+1) 
                  Else
                    MessageRequester("Information","Fichier trop petit !")
                    Goto fin
                  EndIf
                EndIf
                
                
                TempsDepart = ElapsedMilliseconds()
                
                
                ;mdp$, total, md5$, octet(), bit()
                
                RandomSeed(total)
                len*8
                len2=1
                
                While Eof(0) = 0
                  b.b=ReadByte(0)
                  
                  b=b!Random(255)
                  b=b!Random(255)
                  b=b!Random(255)
                  b=b!Random(255)
                  b=b!Random(255)
                  b=b!Random(255)
                  b=b!Random(255)
                  
                  If bit(len2)=0
                    b=b!Random(255)
                    b=b!Random(255)
                    b=b!Random(255)
                    b=b!Random(255)
                  EndIf
                  
                  
                  While mdp_2>Len(mdp$)
                    mdp_2-Len(mdp$)
                  Wend
                  a$=Mid(mdp$,mdp_2,1)
                  b=b!Asc(a$)
                  deca2=Asc(a$)&%00000011
                  mdp_2+1
                  
                  While md5_2>Len(md5$)
                    md5_2-Len(md5$)
                  Wend
                  a$=Mid(md5$,md5_2,1)
                  b=b!Asc(a$)
                  deca=Asc(a$)&%00000011
                  md5_2+1
                  
                  
                  While tot_2>Len(Str(total))
                    tot_2-Len(Str(total))
                  Wend
                  a$=Mid(Str(total),tot_2,1)
                  b=b!Asc(a$)
                  tot_2+1
                  
                  
                  While tot2_2>Len(mdp$)
                    tot2_2-Len(mdp$)
                  Wend
                  a$=Mid(mdp$,tot2_2,1)
                  b=b!(Asc(a$)<<deca)
                  tot2_2+1
                  
                  While tot3_2>Len(md5$)
                    tot3_2-Len(md5$)
                  Wend
                  a$=Mid(md5$,tot3_2,1)
                  b=b!(Asc(a$)<<deca2)
                  tot3_2+1
                  
                  ; -------------------- bit de poids fort
                  b!(bit(len2)*128)
                  len2+1
                  If len2>len
                    len2=1
                  EndIf
                  
                  
                  WriteByte(1,b)
                Wend
                
                fin:
                CloseFile(0)
                CloseFile(1)
                RandomSeed(new)
                new+1
                
                TempsEcoule = ElapsedMilliseconds()-TempsDepart
                Debug "Temps écoulé : "+Str(TempsEcoule)+" millisecondes" 
                
                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                ;;;;;;;;;;;;;;;;;;;;;;;;;;fin;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
              Else
                MessageRequester("Information","Impossible d'ouvrir le fichier!")
                End
              EndIf
            EndIf
            
            For i=1 To 3
              Beep_(1500,90)
              Delay(50)
            Next
            
            MessageRequester("Information","Temps écoulé : "+Str(TempsEcoule)+" millisecondes")
          Else
            MessageRequester("Information", "Vous devez saisir un mot de passe " + #CRLF$ + "qui servira à crypter les données.") 
            SetActiveGadget(#Password)
          EndIf ;Fin de la condition un mot de passe doit etre valide 
        EndIf ;Fin de If Run .... 
        
      Case #PB_Event_CloseWindow
        End
        
    EndSelect
  ForEver
EndProcedure

Re: Besoin de conseils pour fignoler mon crypteur

Publié : ven. 18/mars/2016 19:04
par SPH
Je voudrais faire ca (gfx temporaires) :
Image
J'avais vu de magnifiques graphismes de boutons d'un logiciel de gallyHC. Et je crois me souvenir que tout etait géré par un canvas.
Vous voyez ce que je veux dire ? 8O

Re: Besoin de conseils pour fignoler mon crypteur

Publié : ven. 18/mars/2016 20:04
par falsam
Le prix de la super faineasse est attribué à ...... Suspense .......SPH ...... Applause & YeahHHHhhhhhh

Petit cahier des charges sommaire.

- Un bouton (canvas) pour la fonction Crypter et Décrypter
- L'utilisateur saisit un mot de passe (En fait c'est la clé de cryptage et de décryptage)
- L'utilisateur choisit le fichier à Crypter ou à décrypter.

Question.
- Le fichier final est choisi au moment de lancer le traitement ou bien avant de lancer le traitement ?

Commentaire.
SPH il me semble que tu sais dessiner dans un Sprite ? Dans un canvas c'est la même chose.

PS : Aux non habitués de FreeChat : Il est inutile de me faire des remarques sur les propos que je tiens sur SPH. Je sais qu'il ne m'en voudra pas.

Re: Besoin de conseils pour fignoler mon crypteur

Publié : ven. 18/mars/2016 20:06
par SPH
je vais mediter tout cela 8)

Re: Besoin de conseils pour fignoler mon crypteur

Publié : ven. 18/mars/2016 23:50
par falsam
Je laisse le code précédent au profit de celui là provisoirement disponible en cliquant sur ce lien

Lien supprimé : Voir le lien de SPH plus loin.

- Source
- Image PNG & Photofiltre

Re: Besoin de conseils pour fignoler mon crypteur

Publié : sam. 19/mars/2016 8:15
par Micoute
On m'a souvent dit qu'un petit croquis valait mieux qu'un long discours !

Re: Besoin de conseils pour fignoler mon crypteur

Publié : sam. 19/mars/2016 14:12
par SPH
Merci falsam. Ton truc est tres beau. Je l'etudierais pour voir comment tu as fait (donc, logiquement, je n'ai plus de raison de demander quoi que ce soit sur les canvas)

Re: Besoin de conseils pour fignoler mon crypteur

Publié : sam. 19/mars/2016 14:29
par falsam
C'est moi qui te remercie pour ce code de cryptage & décryptage qui est le plus gros du travail. Ma participation ne se limite qu'à l'enveloppe c'est à dire même pas 1% du code.

Re: Besoin de conseils pour fignoler mon crypteur

Publié : dim. 20/mars/2016 16:36
par SPH
Report d'un bug. Il faut remplacer le randowSeed(new) :

Code : Tout sélectionner

fin:
CloseFile(0)
CloseFile(1)
RandomSeed(new)
new+1
par ceci :

Code : Tout sélectionner

fin:
CloseFile(0)
CloseFile(1)
RandomSeed(r(new))
new+1
Tout ce que vous avez deja crypté est correct malgré tout.

Le code carrossé par Falsam : http://xmas.free.fr/sph/MutanteKey.zip

Le crypteur en exe : http://xmas.free.fr/sph/MutanteKey.exe