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