[Résolu]Problème de déclaration (portée de variables)
Publié : sam. 02/févr./2008 20:12
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
Le code
A tout hasard la librairie mcrypt peut-être chargée ici
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