[Résolu]Problème de déclaration (portée de variables)

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
DarkVader
Messages : 95
Inscription : mer. 11/juil./2007 10:56

[Résolu]Problème de déclaration (portée de variables)

Message par DarkVader »

Bonjour,
j'ai un petit soucis avec le code d'une dll utilisant mcrypt.
D'après ce que j'ai pu identifier la variable identifiant la ressource (td) n'est pas reconnue dans la procédure -
j'ai l'erreur «Invalid memory access »
sur la ligne

Code : Tout sélectionner

td=CallFunctionFast(*mc_open,#MCRYPT_3DES,@"",#MCRYPT_ECB,@"") 


Le code

Code : Tout sélectionner

OpenLibrary(255,"libmcrypt.dll")

; functions
*mc_open = GetFunction(255,   "mcrypt_module_open")
*mc_close = GetFunction(255,  "mcrypt_module_close")
*mc_init = GetFunction(255,   "mcrypt_generic_init")
*mc_deinit = GetFunction(255, "mcrypt_generic_deinit")
*mcg_end = GetFunction(255,   "mcrypt_generic_end")
*mc_decrypt = GetFunction(255,"mdecrypt_generic")
*mc_generic = GetFunction(255,"mcrypt_generic")
*mc_ivsize = GetFunction(255, "mcrypt_enc_get_iv_size")
*mc_ksize = GetFunction(255,  "mcrypt_enc_get_key_size")
*mc_IV = GetFunction(255,     "mcrypt_create_iv")

Structure MCRYPT
  *algorithm.s
  *a_directory.s
  *mode.s
  *m_directory.s     
EndStructure 

; Constants
#MCRYPT_3DES="tripledes"
#MCRYPT_ECB="ecb"
#MCRYPT_RAND="2"

Global Dim td.MCRYPT(4)

Procedure.s DeleteZero(sStr.s)   ;   Supprimer les "0" excédentaires
  t.l=0
  Repeat 
    If Right(sStr.s,1)="0"
      sStr.s=Left(sStr.s,Len(sStr.s)-1)
    Else
      t.l=1
    EndIf
  Until t.l<>0
  
  ProcedureReturn sStr.s
EndProcedure

Procedure.s global_3DES(strInput.s, key.s, sens.s ="CRYPT") 
		If(strInput<>"" And key<>"")

        td=CallFunctionFast(*mc_open,#MCRYPT_3DES,@"",#MCRYPT_ECB,@"")  ; Ressource
    		ks.l = CallFunctionFast(*mc_ksize,td)                           ; Longueur de clé
		
		    *Buffer = AllocateMemory(Len(key.s))
        PokeS(*Buffer, key.s)
        key.s = MD5Fingerprint(*Buffer,Len(key.s))                      ; MD5
        key.s=Mid(key.s,1,ks.l)		                                      ; la clé
				
        ivs.l = CallFunctionFast(*mc_ivsize,td)                         ; longueur du vecteur d'initialisation 
    
        RandomSeed(GetTickCount_())
        IV.s="00000000"
       ;IV.s = CallFunctionFast(*mc_IV,Str(ivs),#MCRYPT_RAND)           ; vecteur d'initialisation (inutilisé en mode ecb)


        result.l = CallFunctionFast(*mc_init,td,@key,ks.l,@IV.s)
				If sens.s="CRYPT"                                               ; CRYPT
					rep = CallFunctionFast(*mc_generic,td,@strInput.s,Len(strInput.s))
				Else                                                            ; UNCRYPT
					p_t=CallFunctionFast(*mc_decrypt,td,@strInput.s,Len(strInput.s))
					s_t.s=Str(p_t)
					ret$ =DeleteZero(s_t.s)    ;RTrim($p_t,"\0");
				EndIf
						
				CallFunctionFast(*mc_deinit,td)
        CallFunctionFast(*mc_close,td)
        FreeMemory(*Buffer)
						
			EndIf
  ProcedureReturn ret.s
EndProcedure

ProcedureDLL Encrypt_3DES(strInput$,key$)
  dat.s=global_3DES(dat.s,key.s,"CRYPT")
  
  ProcedureReturn dat.s
EndProcedure

ProcedureDLL Uncrypt_3DES(strInput$,key$)
  dat.s=global_3DES(dat.s,key.s,"UNCRYPT")
  
  ProcedureReturn dat.s
EndProcedure
A tout hasard la librairie mcrypt peut-être chargée ici
Dernière modification par DarkVader le sam. 16/févr./2008 11:05, modifié 1 fois.
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Message par Jacobus »

tu devrais peut-être tester tes fonctions plutôt que de les énumérer, comme ça

Code : Tout sélectionner

*mc_open = GetFunction(255,   "mcrypt_module_open")
If *mc_open     
 td=CallFunctionFast(*mc_open,#MCRYPT_3DES,@"",#MCRYPT_ECB,@"")  ; Ressource
EndIf 
et cet argument là @"" je ne suis pas sûr que ce soit utilisable, ça renvoit rien...
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Avatar de l’utilisateur
DarkVader
Messages : 95
Inscription : mer. 11/juil./2007 10:56

Message par DarkVader »

Pour peu que la déclaration de la fonction et la fonction (telle que déclarée) se trouve en dehors d'une procédure
le code se déroule correctement, c'est donc apparemment bien un problème de portée de variable que je ne maitrise pas.

@"" passe effectivement une valeur nulle mais c'est volontaire.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

et pense à utiliser les prototypes, c'est plus efficace qu'un CallFunction()

Tu trouveras un exemple écrit par Freak ici
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Avatar de l’utilisateur
DarkVader
Messages : 95
Inscription : mer. 11/juil./2007 10:56

Message par DarkVader »

Je ne suis pas contre mais cela ne resoud pas mon problème de code qui s'exécute parfaitement en mode console (sans aucun appel de procédure)
et comme j'en suis à mon second bidouillage en PureBasic je m'en tiendrais pour l'instant à résoudre le problème initial avant d'aborder ce point :)
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Message par Jacobus »

Dans ce cas j'en reviens au point précédent, fais un essai en modifiant tes arguments. Remplace @"" par #NULL ou 0 et vois ce que cela donne.
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Avatar de l’utilisateur
DarkVader
Messages : 95
Inscription : mer. 11/juil./2007 10:56

Message par DarkVader »

Je vais le faire si cela peut t'être agréable et te tiendrais au courant
mais ce qui m'interpelle c'est que si je sors de la procédure la ligne qui plante td=CallFunctionFast(*mc_open,#MCRYPT_3DES,@"",#MCRYPT_ECB,@"")
et que je la place immédiatement après Global Dim td.MCRYPT(4)
alors le plantage a lieu sur la ligne suivante utilisant la ressource td soit ks.l = CallFunctionFast(*mc_ksize,td).

Si je sors à nouveau cette ligne de la procédure pour la placer comme précédemment alors le plantage aura lieu sur ivs.l = CallFunctionFast(*mc_ivsize,td)
et ainsi de suite d'où ma réflexion sur la portée de la déclaration de td.
Dans le cadre d'une utilisation console en développement non procédural la syntaxe est correcte et le déroulement sans plantage.
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Message par Jacobus »

Je viens de tester ton code en collant des "tests" en debug et en remplaçant tes ProcedureReturn dat.s par Debug dat (ProcedureReturn donne une valeur num pas un string) et je n'ai aucun message d'erreur.
Le résultat est inexistant mais ça plante pas. Je trouve étrange que cela fonctionne en mode console...

Il me semble que tu mélanges les variables .s et $ qui n'ont pas la même portée puisque totalement différentes. J'essaierai jusqu'à obtenir un résultat.
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Avatar de l’utilisateur
DarkVader
Messages : 95
Inscription : mer. 11/juil./2007 10:56

Message par DarkVader »

Je te remercie - PB m'est totalement étranger et je nage avec les déclarations, portées, pointeurs etc.

Si cela peut t'aider la doc pour php de mcrypt se trouve là
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

tu pourrais montrer ton exemple en mode console qui fonctionne ?
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

j'ai fait ce simple test, ça ne plante ,et j'ai bien une valeur

Code : Tout sélectionner

PrototypeC Proto_mcrypt_module_open(a.s,ta.s,b.s,tb.s) 
Global mcrypt_module_open.Proto_mcrypt_module_open

If OpenLibrary(255,"libmcrypt.dll")
  mcrypt_module_open=GetFunction(255,   "mcrypt_module_open")
EndIf

Procedure test()
td = mcrypt_module_open("rijndael-256", "", "ofb", "");
Debug td
EndProcedure

TEST()

End
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Message par Jacobus »

Moi je teste ainsi, ça ne plante pas mais je n'ai pas de valeur de retour! :lol:

Code : Tout sélectionner

If OpenLibrary(255,"libmcrypt.dll") 
 Debug "lib ok"
	; functions 
; 	*mc_open = GetFunction(255,   "mcrypt_module_open") 
; 	*mc_close = GetFunction(255,  "mcrypt_module_close") 
; 	*mc_init = GetFunction(255,   "mcrypt_generic_init") 
; 	*mc_deinit = GetFunction(255, "mcrypt_generic_deinit") 
; 	*mcg_end = GetFunction(255,   "mcrypt_generic_end") 
; 	*mc_decrypt = GetFunction(255,"mdecrypt_generic") 
; 	*mc_generic = GetFunction(255,"mcrypt_generic") 
; 	*mc_ivsize = GetFunction(255, "mcrypt_enc_get_iv_size") 
; 	*mc_ksize = GetFunction(255,  "mcrypt_enc_get_key_size") 
; 	*mc_IV = GetFunction(255,     "mcrypt_create_iv") 
Else 
 Debug "Erreur! lib inaccessible."
EndIf 

Structure MCRYPT 
  *algorithm.s 
  *a_directory.s 
  *mode.s 
  *m_directory.s      
EndStructure 

; Constants 
#MCRYPT_3DES="tripledes" 
#MCRYPT_ECB="ecb" 
#MCRYPT_RAND="2" 

Global key.s

Global Dim td.MCRYPT(4) 
;Global NewList 

Procedure.s DeleteZero(sStr.s)   ;   Supprimer les "0" excédentaires 
  t.l=0 
  Repeat 
    If Right(sStr.s,1)="0" 
      sStr.s=Left(sStr.s,Len(sStr.s)-1) 
    Else 
      t.l=1 
    EndIf 
  Until t.l<>0 
  
  ProcedureReturn sStr.s 
EndProcedure 

Procedure.s global_3DES(strInput.s, key.s, sens.s ="CRYPT") 
      
      If strInput<>"" And key<>""
        
        mc_open = GetFunction(255,   "mcrypt_module_open")
         td = CallFunctionFast(mc_open,#MCRYPT_3DES,@"",#MCRYPT_ECB,@""); Ressource 
        
        mc_ksize = GetFunction(255,  "mcrypt_enc_get_key_size")
         ks.l = CallFunctionFast(mc_ksize,td)                           ; Longueur de clé 
      
       key.s = "125478901254789012547890"
        *Buffer = AllocateMemory(Len(key.s)) 
        PokeS(*Buffer, key.s) 
        md5.s = MD5Fingerprint(*Buffer,Len(key.s))                      ; MD5 
        key.s=Mid(md5,1,ks.l)                                         ; la clé 
        

        
        mc_ivsize = GetFunction(255, "mcrypt_enc_get_iv_size")    
        ivs.l = CallFunctionFast(mc_ivsize,td)                         ; longueur du vecteur d'initialisation 
    
        RandomSeed(GetTickCount_()) 
        IV.s="00000000" 
       ;IV.s = CallFunctionFast(*mc_IV,Str(ivs),#MCRYPT_RAND)           ; vecteur d'initialisation (inutilisé en mode ecb) 

        mc_init = GetFunction(255,   "mcrypt_generic_init")
        result.l = CallFunctionFast(mc_init,td,@key,ks.l,@IV.s) 
            If sens.s="CRYPT"   
               mc_generic = GetFunction(255,"mcrypt_generic")                                            ; CRYPT 
               rep = CallFunctionFast(*mc_generic,td,@strInput.s,Len(strInput.s)) 
            Else
               mc_decrypt = GetFunction(255,"mdecrypt_generic")                                                            ; UNCRYPT 
               p_t=CallFunctionFast(*mc_decrypt,td,@strInput.s,Len(strInput.s)) 
               s_t.s=Str(p_t) 
               ret$ =DeleteZero(s_t.s)    ;RTrim($p_t,"\0"); 
            EndIf 
            mc_deinit = GetFunction(255, "mcrypt_generic_deinit")     
            CallFunctionFast(*mc_deinit,td) 
        mc_close = GetFunction(255,  "mcrypt_module_close")
        CallFunctionFast(*mc_close,td) 
        FreeMemory(*Buffer) 
                   
      EndIf 
  ProcedureReturn ret.s 
EndProcedure 

ProcedureDLL Encrypt_3DES(strInput$,key.s) 
 
  dat.s = global_3DES(strInput$,key.s,"CRYPT") 
  
  ;ProcedureReturn dat.s 
  Debug dat 
  
EndProcedure 

ProcedureDLL Uncrypt_3DES(strInput$,key.s) 
  
  dat.s = global_3DES(strInput$,key.s,"UNCRYPT") 
  
  ;ProcedureReturn dat.s 
  Debug dat
  
EndProcedure


 Saisie$ =  InputRequester("Cryptage tripleDES","Entrez le message","")
 If Saisie$ <>""
  Encrypt_3DES(Saisie$,key.s)
  CloseLibrary(255)
 EndIf 
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Ca plante car le pointeur *mc_open est reconnu comme pointeur local dans la procedure global_3DES(strInput.s, key.s, sens.s ="CRYPT") car il n'est pas déclaré en global au départ.

Sinon, pour éviter ce genre de soucis, il faut travailler avec l'option EnableExplicit écrite au début du code, ce qui oblige à déclarer chaque variable, je ne travaille que de cette manière.

Les déclarations des pointeurs deviennent

Code : Tout sélectionner

Global *mc_close = GetFunction(255,  "mcrypt_module_close")
Global *mc_init = GetFunction(255,   "mcrypt_generic_init")
Global *mc_deinit = GetFunction(255, "mcrypt_generic_deinit")
Global *mcg_end = GetFunction(255,   "mcrypt_generic_end")
Global *mc_decrypt = GetFunction(255,"mdecrypt_generic")
Global *mc_generic = GetFunction(255,"mcrypt_generic")
Global *mc_ivsize = GetFunction(255, "mcrypt_enc_get_iv_size")
Global *mc_ksize = GetFunction(255,  "mcrypt_enc_get_key_size")
Global *mc_IV = GetFunction(255,     "mcrypt_create_iv")
Chaque pointeur doit être testé et sa valeur doit être différente de 0, sinon c'est le plantage.

Sinon, @"" est parfaitement valable, la chaine "" sera mise en datasection dans le fichier asm avec comme valeur un octet à 0 indiquant que la chaine est vide (caractère de fin de chaine) et @"" retourne l'adresse de cet octet.


Encore un conseil DarkVader, pour avoir du code stable, il faut obligatoirement tester les retours des fonctions PB, des API, des allocations mémoire etc.

La ligne

Code : Tout sélectionner

OpenLibrary(255,"libmcrypt.dll")
doit devenir quelque chose comme ceci

Code : Tout sélectionner

If OpenLibrary(255,"libmcrypt.dll") = 0
   MessageRequester("Erreur", "le fichier libmcrypt.dll n'a pas pu être ouvert", 16)
   ; il faut traiter le cas selon ses besoins
   End
EndIf
L'allocation mémoire

Code : Tout sélectionner

          *Buffer = AllocateMemory(Len(key.s))
        PokeS(*Buffer, key.s)
doit être corrigé car PokeS écrit une chaîne de caractères, y comprit son caractère nul de fin de chaîne (0) et la fonction len() ne retourne que le nombre de lettre sans le caractère de fin de chaine qui dans le cas de compilation Unicode est un double 0. Il faut préférer l'utilisation de la fonction StringByteLength(Chaine$ [, Format]) pour retrouver la taille de la chaine et quelque soit le mode (ASCII ou unicode), tu ajoutes 2 pour l'allocation mémoire, cela sera Ok pour le mode ASCCi ou UNICODE.

Il faut absolument tester la valeur retournée par la fonction d'allocation mémoire, elle doit être différente de 0. Si la valeur vaut 0, ton code plantera à la ligne suivante

Code : Tout sélectionner

PokeS(*Buffer, key.s)
Voilà, c'est juste quelques conseils.
A+
Denis
Avatar de l’utilisateur
DarkVader
Messages : 95
Inscription : mer. 11/juil./2007 10:56

Message par DarkVader »

J'ai fait ce que j'ai pu mais j'ai encore un boggue
Le code adapté avec procédure mais qui boggue suite à l'initialisation (mcrypt_generic_init) sur la ligne If sens="CRYPT"

Code : Tout sélectionner

PrototypeC.l Proto_mcrypt_module_open(a.s,ta.s,b.s,tb.s)
PrototypeC.l Proto_mcrypt_enc_get_key_size(c.l)
PrototypeC.l Proto_mcrypt_enc_get_iv_size(c.l)
PrototypeC.l Proto_mcrypt_generic_init(c.l,k.s,i.s)
PrototypeC.s Proto_mcrypt_generic(c.l,s.s)
PrototypeC.s Proto_mdecrypt_generic(c.l,s.s)
PrototypeC.l Proto_mcrypt_generic_deinit(c.l)
PrototypeC.l Proto_mcrypt_module_close(c.l)

Global mcrypt_module_open.Proto_mcrypt_module_open
Global mcrypt_enc_get_key_size.Proto_mcrypt_enc_get_key_size
Global mcrypt_enc_get_iv_size.Proto_mcrypt_enc_get_iv_size
Global mcrypt_generic_init.Proto_mcrypt_generic_init
Global mcrypt_generic.Proto_mcrypt_generic
Global mdecrypt_generic.Proto_mdecrypt_generic
Global mcrypt_generic_deinit.Proto_mcrypt_generic_deinit
Global mcrypt_module_close.Proto_mcrypt_module_close

idLib.l=OpenLibrary(#PB_Any ,"libmcrypt.dll")
If idLib<>0
  Dim tInclude.l(8)
  tInclude(0)=(mcrypt_module_open=       GetFunction(idLib.l,  "mcrypt_module_open"))
  tInclude(1)=(mcrypt_enc_get_key_size=  GetFunction(idLib.l,  "mcrypt_enc_get_key_size"))
  tInclude(2)=(mcrypt_enc_get_iv_size=   GetFunction(idLib.l,  "mcrypt_enc_get_iv_size"))
  tInclude(3)=(mcrypt_generic_init=      GetFunction(idLib.l,  "mcrypt_generic_init"))
  tInclude(4)=(mcrypt_generic=           GetFunction(idLib.l,  "mcrypt_generic"))  
  tInclude(5)=(mdecrypt_generic=         GetFunction(idLib.l,  "mdecrypt_generic"))  
  tInclude(6)=(mcrypt_generic_deini=     GetFunction(idLib.l,  "mcrypt_generic_deinit"))
  tInclude(7)=(mcrypt_module_close=      GetFunction(idLib.l,  "mcrypt_module_close"))
  For x.l=0 To 7
    If tInclude(x)=0
      End
    EndIf
  Next
Else
  End 
EndIf


;Global *mc_init = GetFunction(255, "mcrypt_generic_init") 

; Constants
#MCRYPT_3DES="tripledes"
#MCRYPT_ECB="ecb"

Procedure.s DeleteZero(sStr.s)     ;   Supprimer les "0" de fin
  t.l=0
  Repeat 
    If Right(sStr.s,1)="0"
      sStr.s=Left(sStr.s,Len(sStr.s)-1)
    Else
      t.l=1
    EndIf
  Until t.l<>0
  
  ProcedureReturn sStr.s
EndProcedure
Procedure.s bin2hex(sStr.s)        ;   Convertir un chaine ascii en hex
  For x.l=1 To Len(sStr)
    subStr.s=Mid(sStr,x,1)
    hStr.s=LSet(Hex(Asc(subStr)),2,"0")
    ret.s=ret.s+hStr
  Next
  
  ProcedureReturn ret
EndProcedure
Procedure.s Hex2bin(sStr.s)        ;   Convertir un chaine hex en ascii
  For x.l=1 To Len(sStr)/2
    j.l=2*x-1
    subStr.s=Mid(sStr,j,2)
    BinC.l= (Val(Left(subStr,1))*16)+Val(Right(subStr,1))
    ret.s=ret.s+Chr(BinC.l)
  Next
  
  ProcedureReturn ret
EndProcedure

Procedure.s global_3DES(strInput.s, key.s, sens.s)

  td.l = mcrypt_module_open("tripledes", "", "ecb", "")
  If td<>0
    
    *Buffer = AllocateMemory(StringByteLength(key.s)+1)
    PokeS(*Buffer, key.s)
    md5.s = MD5Fingerprint(*Buffer,StringByteLength(key.s)+1)
    FreeMemory(*Buffer)
    
    ks.l=mcrypt_enc_get_key_size(td)
    ivs.l =mcrypt_enc_get_iv_size(td)
    
    If ks.l<>0 And ivs.l<>0
        key.s=Mid(md5.s,1,ks.l)
        IV.s=LSet("",ivs.l,"0")
              
        ;result.l=mcrypt_generic_init(td,key.s,IV.s)
        result.l = CallFunctionFast(*mc_init,td,@key,ks.l,@"00000000")
  
;Debug GetErrorDescription()
;Debug "init: "+Str(result.l)
             
        If result.l>=0          
          If sens.s="CRYPT"
            lInput.l=ks.l-(Len(strInput.s) % ks.l)
Debug Str(lInput)            
            strInput.s=strInput.s+Space(lInput.l)          	
            ret.s = mcrypt_generic(td, strInput.s)
            ret=bin2hex(ret)
          Else
        	;	p_t.s = mdecrypt_generic(td, strInput.s);
        		;ret =DeleteZero(p_t)
        		;ret=RTrim(ret)
        		;ret=hex2bin(ret)
        	EndIf
          	
        	Debug "ret: "+ret        	
        	Debug "strInput.s: "+strInput.s
        	
          Debug mcrypt_generic_deinit(td)      	
        EndIf
                	
    EndIf
        
    mcrypt_module_close(td)
  
  EndIf
  
  ProcedureReturn ret
EndProcedure

Debug global_3DES("le message à chiffrer...","la clé","CRYPT")

End
;ProcedureDLL Crypt_3DES(strInput$,key$)      ;   EXPORTER Procédure « CRYPT »
;  dat.s=global_3DES(dat.s,key.s,"CRYPT")
  
;  ProcedureReturn dat.s
;EndProcedure

;ProcedureDLL Uncrypt_3DES(strInput$,key$)    ;   EXPORTER Procédure « UNCRYPT »
;  dat.s=global_3DES(dat.s,key.s,"UNCRYPT")
  
;  ProcedureReturn dat.s
;EndProcedure

En réponse à Comtois : le code qui marchait

Code : Tout sélectionner

OpenLibrary(255,"libmcrypt.dll")

; This code was translated from mcrypt.h
; Completed 10:01 PM 3/17/05, test shows it works
; functions

Global *mc_open = GetFunction(255, "mcrypt_module_open")
Global *mc_ivsize = GetFunction(255, "mcrypt_enc_get_iv_size")
Global *mc_ksize = GetFunction(255, "mcrypt_enc_get_key_size")
Global *mc_init = GetFunction(255, "mcrypt_generic_init")
Global *mc_decrypt = GetFunction(255, "mdecrypt_generic")
Global *mc_generic = GetFunction(255, "mcrypt_generic")
Global *mc_deinit = GetFunction(255, "mcrypt_generic_deinit")
Global *mc_close = GetFunction(255, "mcrypt_module_close")

Structure MCRYPT
    *algorithm.s
    *a_directory.s
    *mode.s
    *m_directory.s
 EndStructure
 
Global Dim td.MCRYPT(4)

#MCRYPT_3DES    =   "tripledes"
#MCRYPT_ECB   =   "ecb"

Procedure.s DeleteZero(sStr.s)     ;   Supprimer les "0" de fin
  t.l=0
  Repeat 
    If Right(sStr.s,1)="0"
      sStr.s=Left(sStr.s,Len(sStr.s)-1)
    Else
      t.l=1
    EndIf
  Until t.l<>0
  
  ProcedureReturn sStr.s
EndProcedure
Procedure.s bin2hex(sStr.s)        ;   Convertir un chaine ascii en hex
  For x.l=1 To Len(sStr)
    subStr.s=Mid(sStr,x,1)
    hStr.s=LSet(Hex(Asc(subStr)),2,"0")
    ret.s=ret.s+hStr
  Next
  
  ProcedureReturn ret
EndProcedure
Procedure.s Hex2bin(sStr.s)        ;   Convertir un chaine hex en ascii
  For x.l=1 To Len(sStr)/2
    j.l=2*x-1
    subStr.s=Mid(sStr,j,2)
    BinC.l= (Val(Left(subStr,1))*16)+Val(Right(subStr,1))
    ret.s=ret.s+Chr(BinC.l)
  Next
  
  ProcedureReturn ret
EndProcedure

    key.s=" "
    strInput.s = "TestEncrypt" 
    sens.s="CRYPT"   
;Procedure.s global_3DES(strInput.s, key.s)  ;, sens.s) 

    
    td = CallFunctionFast(*mc_open,#MCRYPT_3DES,@"",#MCRYPT_ECB,@"")
Debug td
    ivs.l = CallFunctionFast(*mc_ivsize,td)
    ks.l = CallFunctionFast(*mc_ksize,td)    
    

    *Buffer = AllocateMemory(Len(key))
    PokeS(*Buffer, key)
    key = MD5Fingerprint(*Buffer,Len(key))
    key=LCase(Mid(key,1,ks.l))
    result.l = CallFunctionFast(*mc_init,td,@key,ks.l,@"00000000")    
    
    If result>=0
      If sens="CRYPT"
        lDat.l=Round(Len(strInput) /ivs.l,1)*ivs.l    
  Debug lDat.l
        
        result = CallFunctionFast(*mc_generic,td,@strInput,lDat.l)
        
        dat.s=Mid(strInput,1,lDat.l)
        
        sRetB.s= bin2hex(dat)
       Else
          dat.s=hex2bin(strInput)
          result = CallFunctionFast(*mc_decrypt,td,@dat,Len(dat))
          sRetB.s=RTrim(DeleteZero(dat))
       EndIf
Debug Len(sRetB)
Debug sRetB    
      CallFunctionFast(*mc_deinit,td)
    EndIf
    CallFunctionFast(*mc_close,td)
    FreeMemory(*Buffer)
    
;    ProcedureReturn sRetB
;EndProcedure

;retdat.s=global_3DES("TestEncrypt"," ")
 
Dernière modification par DarkVader le mar. 05/févr./2008 13:17, modifié 1 fois.
Avatar de l’utilisateur
DarkVader
Messages : 95
Inscription : mer. 11/juil./2007 10:56

Message par DarkVader »

Plus de suggestion :(
Même si j'ai avancé, ce n'est toujours pas résolu :oops:
Répondre