Aaaa les vacances c'est bien, mais sans internet parfois lorqu'on code c'est un peu galère.Voici mon code. Si vous compilez en normal ça fonctionne en unicode il y a toujours un moment ou ça plante sur un allocatememory.
Est ce que c'est moi ou bien il y a bien un problème ?
Je me demande d'ailleur si ça vient d'AllocateMemory ou bien de la fonction StringByteLength()
A votre avis ?
Merci d'avance !
Code : Tout sélectionner
Structure Prefs
Cle.s
EndStructure
Global Prefs.Prefs
prefs\Cle="Monpassword"
Procedure.s mkpass(password_length)
chars$="abcdefghijklmnopqrstuvwxyz1234567890" ; possible characters, keep these lcase
For a=1 To password_length
Select Random(1) ; 0 = char, 1 = digit
Case 1 ; is digit
pass$+Str(Random(9))
Case 0 ; is character
position=Random(Len(chars$)) ; random character selector
char_case = Random(10)
If char_case<5 ; less than 5 is ucase
pass$+UCase(Mid(chars$,position,1))
Else
pass$+Mid(chars$,position,1)
EndIf
EndSelect
Next
ProcedureReturn pass$
EndProcedure
Procedure RC4Mod(a,b)
ProcedureReturn a-(a/b)*b
EndProcedure
Procedure.l RC4Mem(Mem.l, memLen.l, key.s)
;RC4Mem(*MemoryBuffer.l, MomeryLength.l, Key.s)
Dim S.w(255)
Dim K.w(255)
i.l=0: j.l=0: t.l=0: x.l=0
temp.w=0: y.w=0
Outp.s=""
For i = 0 To 255
S(i) = i
Next
j = 1
For i = 0 To 255
If j > Len(key)
j = 1
EndIf
K(i) = Asc(Mid(key, j, 1))
j = j + 1
Next i
j = 0
For i = 0 To 255
j = RC4Mod(j + S(i) + K(i), 256)
temp = S(i)
S(i) = S(j)
S(j) = temp
Next i
i = 0
j = 0
For x = 0 To memLen-1
i = RC4Mod(i + 1, 256)
j = RC4Mod(j + S(i),256)
temp = S(i)
S(i) = S(j)
S(j) = temp
t = RC4Mod(S(i) + RC4Mod(S(j), 256) , 256)
y = S(t)
PokeB(Mem+x, PeekB(Mem+x)!y)
Next
ProcedureReturn Mem
EndProcedure
Procedure.s BuildInCrypteText(Text.s, Key.s)
Protected CrypteText.s
If Len(Text)>0
*mem=AllocateMemory(StringByteLength(Text))
PokeS(*mem,Text)
RC4Mem(*mem,StringByteLength(Text),Key)
CrypteText=PeekS(*mem)
FreeMemory(*mem)
EndIf
Debug "Crypte :"+Text+" =>"+CrypteText
ProcedureReturn CrypteText
EndProcedure
Procedure.s BuildInDecrypteText(Text.s, Key.s)
Protected DeCrypteText.s
If Len(Text)>0
Debug StringByteLength(Text)
*mem=AllocateMemory(StringByteLength(Text))
PokeS(*mem,Text)
RC4Mem(*mem,StringByteLength(Text),Key)
DeCrypteText=PeekS(*mem)
FreeMemory(*mem)
EndIf
Debug "DeCrypte :"+Text+" =>"+DeCrypteText
ProcedureReturn DeCrypteText
EndProcedure
;********************
;Le choix du système de cryptage
;********************
Procedure.s CrypteText(Text.s)
ProcedureReturn BuildInCrypteText(Text.s, Prefs\Cle)
EndProcedure
Procedure.s DecrypteText(Text.s)
ProcedureReturn BuildInDecrypteText(Text.s, Prefs\Cle)
EndProcedure
For z=1 To 200
test.s=CrypteText(mkpass(Random(4)+1))
result.s=DecrypteText(test)
Debug test+" "+result
Next