Cryptage / decryptage en rc4

Soyez le premier à donner votre avis sur cette source.

Vue 10 755 fois - Téléchargée 913 fois

Description

Voici un module de classe qui permet de crypter en utilisant l'algorithme RC4.

Voici le code de cette classe. Le ZIP contient aussi un formulaire pour dmontrer le fonctionnement.

Source / Exemple :


Option Explicit

' Classe permettant de coder du texte en utilisant l'algorithme RC4.
'
' Utilisation :
'
' Dim XYZ As New Crypt_RC4
' XYZ.Key = "Mot de passe"
' TexteCrypt = XYZ.Crypt("Texte a crypter")
'
' XYZ.Key = "Mot de passe"
' TexteDcrypt = XYZ.Decrypt("Texte a dcrypter")
'
' Nb: Il faut reinitialiser le mot de passe avant de Crypter / Decrypter une nouvelle fois

Private S(0 To 255) As Long
Private I As Long
Private J As Long

Public Property Let Key(ByVal Key As String)
    Dim Longueur As Long, T As Long
    Longueur = Len(Key)
    For I = 0 To 255
        S(I) = I
    Next I
    
    J = 0
    For I = 0 To 255
        J = (J + S(I) + Asc(Mid$(Key, I Mod Longueur + 1, 1))) And 255&
        T = S(I)
        S(I) = S(J)
        S(J) = T
    Next I
    I = 0
    J = 0
End Property

Public Function Crypt(ByVal Param As String) As String
    Dim Longueur As Long, C As Long, T As Long
    Longueur = Len(Param)
    For C = 1 To Longueur
        I = (I + 1) And 255&
        J = (J + S(I)) And 255&
        T = S(I)
        S(I) = S(J)
        S(J) = T
        
        T = (S(I) + S(J)) And 255&
        
        Mid$(Param, C, 1) = Chr$(Asc(Mid$(Param, C, 1)) Xor S(T))
    Next C
    Crypt = Param
End Function

Public Function Decrypt(ByVal Param As String) As String
    Dim Longueur As Long, C As Long, T As Long
    Longueur = Len(Param)
    For C = 1 To Longueur
        I = (I + 1) And 255&
        J = (J + S(I)) And 255&
        T = S(I)
        S(I) = S(J)
        S(J) = T
        
        T = (S(I) + S(J)) And 255&
        
        Mid$(Param, C, 1) = Chr$(Asc(Mid$(Param, C, 1)) Xor S(T))
    Next C
    Decrypt = Param
End Function

Conclusion :


Attention :
Apres un cryptage / decryptage, il faut redefinir le mot de passe pour reinitialiser la classe.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

PtitJeoJeo
Messages postés
85
Date d'inscription
mardi 29 janvier 2002
Statut
Membre
Dernière intervention
18 avril 2005
-
pourkoi ne pa créér ton propre algo de cryptage ? et qu'il ne soit pa réservé qu'a du texte ? sinon ouai c bien
PtitJeoJeo
lolo32
Messages postés
36
Date d'inscription
mercredi 13 février 2002
Statut
Membre
Dernière intervention
6 juin 2006
-
En fait, certains fichiers nescessites de crypter en RC4, tel les fichers PDF protgs par un mot de passe par exemple.
Tu peux toujours crypter des fichiers : il suffit de passer le contenu du fichier en paramtre, aps l'avoir lu, puis tu obtient en retour le contenu du fichier crypt que tu paux recrire.
cs_bigane
Messages postés
46
Date d'inscription
lundi 4 février 2002
Statut
Membre
Dernière intervention
12 février 2004
-
Salut,
j'ai juste des commentaires d'amélioration de ton code.
1) utilise des long pour la longueur de ton texte (Dim Longueur As Long, C As Long, T As Long); car sinon, tu es limité à 32Ko. Et des fichiers de 32Ko, c'est petit.
2) met "as string" en fin de tes fonctions Crypt et Decrypt, sinon ta fonction renvoie un variant (avec une valeur de type string).
3) utilise mid$(), chr$() sinon ces fonctions (mid() et chr() retournent des variants, et VB insère du code supplémentaire pour transformer ces variants en string.
4) utilise un type long pour i et j. En effet le processeur Intel est plus lent lorsqu'il traite un integer à la place d'un long. Comme ce sont des index d'un tableau, ils seront transformés en long de toutes façons (et utilisation d'une instruction du processeur en plus).
5) utilise (expression) and 255& au lieu de (expression) mod 256, mod est une division et est moins rapide qu'un AND. le & en fin de 255 permet d'effectuer le AND avec un entier long, comme cela il n'y a pas de transformation de type.
6) utilise un tableau de long au lieu d'un tableau d'integer pour S(), et cela toujours pour les mêmes raisons.
7) utilise For C 1 To Longueur au lieu de For C 0 To Longueur - 1
Et tu retireras les C + 1 dans la boucle, tu gagne deux additions à chaque boucle.
8) Facultatif: juste pour la propreté, utilise (I Mod Longueur) + 1 au lieu de I Mod Longueur + 1. (nb: l'utilisation de mod est très judicieuse dans ce cas, merci pour l'astuce qui évite un compteur sur key).

En résumé, plus aucun long dans ce code, des types pour les fonctions, des $ pour les instructions mid et chr, modification des index de boucle.

Sinon, ton code peut être utilisé comme un module, sans rien modifier d'autre.

Bon code, 9 sur 10 si tu effectue toutes ces modifs, sinon 5.
9 car le RC4 est dépassé, personnellement je l'ai recodé en utilisant deux Sbox S1() et S2() et trois indices i,j,k ainsi qu'une ronde d'initialisation paramétrable qui permet de brouiller n fois les deux tables au lieu d'une seule. C'est un bon sujet pour un autre source, non ?

Bigane
TheBabyCool
Messages postés
34
Date d'inscription
dimanche 2 septembre 2001
Statut
Membre
Dernière intervention
4 mars 2003
-
Je suis pas sur que c du RC4(Algo pour crypter a 128 bits)
lolo32
Messages postés
36
Date d'inscription
mercredi 13 février 2002
Statut
Membre
Dernière intervention
6 juin 2006
-
Merci pour tes conseils bigane. Je viens de modifier les sources.

>(I Mod Longueur) + 1 au lieu de I Mod Longueur + 1

J n'ai pas effectu cette modification car l'operation modulo est prioritaire sur l'addition, donc les parentheses sont inutiles.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.