CerberusPau
Messages postés377Date d'inscriptionlundi 3 avril 2006StatutMembreDernière intervention22 août 2018
-
7 mai 2011 à 23:54
CerberusPau
Messages postés377Date d'inscriptionlundi 3 avril 2006StatutMembreDernière intervention22 août 2018
-
8 mai 2011 à 10:16
Bonjour,
J'ai trouvé le code ci-dessous sur une source du forum datant de 2002.
Sub Crypt(Clef As String, Source As String, Destination As String)
Dim a As Integer
Dim b As Double
Dim c As String * 1
Dim K(0 To 255) As Integer
Open Clef For Random As #1 Len = 1
For a = 1 To 256
Get #1, a, c
K(a - 1) = Asc(c)
Next a
Close
If Len(Dir(Destination, 14)) > 0 Then Kill Destination
Open Source For Random As #1 Len = 1
Open Destination For Random As #2 Len = 1
For b = 1 To LOF(1)
Get #1, b, c
c = Chr(K(Asc(c)))
Put #2, b, c
Next b
Close
End Sub
'==================================
Sub Decrypt(Clef As String, Source As String, Destination As String)
Dim a As Integer
Dim b As Double
Dim c As String * 1
Dim K(0 To 255) As Integer
Open Clef For Random As #1 Len = 1
For a = 1 To 256
Get #1, a, c
K(Asc(c)) = a - 1
Next a
Close
If Len(Dir(Destination, 14)) > 0 Then Kill Destination
Open Source For Random As #1 Len = 1
Open Destination For Random As #2 Len = 1
For b = 1 To LOF(1)
Get #1, b, c
c = Chr(K(Asc(c)))
Put #2, b, c
Next b
Close
End Sub
'==================================
Sub KeyGen(Destination As String)
Dim a As Integer
Dim b As Integer
Dim c As String * 1
Dim K(0 To 255) As Integer
For a = 0 To 255
K(a) = a
Next a
Randomize Timer
If Len(Dir(Destination, 14)) > 0 Then Kill Destination
Open Destination For Random As #1 Len = 1
For a = 1 To 256
Do
b = Int(Rnd * 256)
Loop While K(b) < 0
c = Chr$(K(b))
Put #1, a, c
K(b) = -1
Next a
Close
End Sub
Aucun problème avec la syntaxe pour appeler keygen :
Sub CréerClé()
KeyGen ("D:\Test\Clef.ini")
End Sub
Le fichier Clef.ini est bien créé et la clé cryptée est bien dedans.
En revanche, Niet pour les 2 autres Sub (crypt et decrypt); le code ci-dessous est incorrect :
Sub Crypter()
Crypt("D:\Test\Clef.ini","D:\Test\Source.ini","D:\Test\Destination.ini")
End Sub
Message : "erreur de compilation, attendu: ="
J'ai essayé de passer les Sub Crypt et Decrypt en Function, mais sans succès.
Je ne trouve pas où est mon erreur pour pouvoir lancer correctement ces Sub.
Calade
Messages postés1207Date d'inscriptiondimanche 20 avril 2003StatutMembreDernière intervention 4 juin 201610 8 mai 2011 à 10:08
Dans ce cas là, VB6 et VBA ont exactement le même comportement.
Le Call est là pour remplacer une éventuelle variable en retour.
Dans ce cas les Sub et les Fonctions ont la même syntaxe et si les 2 premières que je t'ai suggéré sont strictement identiques du point de vue de leur comportement, la seconde est plus lisible, du moins à mon avis.
Content d'avoir pu t'aider.
Pense à cocher "Réponse Acceptée" si ton problème est résolu.
même si tu ne te soucies pas de la valeur de retour, mais dans ce cas privilégies plutôt la 1ère syntaxe qui fait l'économie d'une variable inutile et perturbante pour un lecteur non habitué au code.
CerberusPau
Messages postés377Date d'inscriptionlundi 3 avril 2006StatutMembreDernière intervention22 août 20181 8 mai 2011 à 09:45
VB6 ? Non, non, c'est une macro VBA sous Excel 2003.
Crypt ne "renvoie" rien, ça n'est pas une Fonction, mais une Procédure qui va Crypter le contenu d'un txt ou d'un ini à l"aide de la clef générée par KeyGen dans Clef.ini.
Toutefois (curieusement) Crypt peut pas être lancé directement (ni passé en Function), et doit être appelé par une Sub : Crypter
De la même manière, Decrypt fera l'inverse.
Comme tu l'as suggéré, je suis passé par "Call" (avec 3 déclarations), et ça fonctionne !
Mais je ne comprends vraiment pas pourquoi ce Call est obligatoire ici.
Dans mon code, tous les autres appels de macros marchent sans...
En tout cas, merci beaucoup!
Code final :
Sub Crypter()
Dim Clef As String, Source As String, Destination As String
Clef = "D:\Test\Clef.ini"
Source = "D:\Test\Source.ini"
Destination = "D:\Test\Destination.ini"
Call Crypt(Clef, Source, Destination)
End Sub