begin process at 2012 02 11 10:50:41
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Sécurité

 > CRYPTAGE / DECRYPTAGE EN RC4

CRYPTAGE / DECRYPTAGE EN RC4


 Information sur la source

Note :
8,5 / 10 - par 2 personnes
8,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Sécurité Niveau :Initié Date de création :28/07/2002 Date de mise à jour :30/07/2002 12:42:26 Vu / téléchargé :7 713 / 670

Auteur : lolo32

Ecrire un message privé
Commentaire sur cette source (16)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
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

  • 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
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.  

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

ATTIBUER UNE SÉQUENCE DE TOUCHE À UN PROG
EJECTER UN CD EN FONCTION DE LA LETTRE DU LECTEUR

 Sources de la même categorie

Source avec Zip Source avec une capture Source .NET (Dotnet) CHIFFREMENT XOR PLUS ROBUSTE par dheroux
Source avec Zip CRYPTAGE MARANT par alpha5
Source avec Zip ACCÈS PAR MOT DE PASSE À FEUILLE EXCEL par mimiZanzan
Source avec Zip CRYPTER-DÉCRYPTER UN TEXTE - TEXTE CRYPTÉ UNIQUEMENT EN MAJ... par Saintache
Source avec Zip Source avec une capture FOLDER PROTECTION par hackoo

Commentaires et avis

Commentaire de PtitJeoJeo le 28/07/2002 22:07:07

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

Commentaire de lolo32 le 29/07/2002 09:21:55

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.

Commentaire de bigane le 29/07/2002 16:12:18

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

Commentaire de TheBabyCool le 29/07/2002 18:04:31

Je suis pas sur que c du RC4(Algo pour crypter a 128 bits)

Commentaire de lolo32 le 30/07/2002 12:46:13

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.

Commentaire de doms le 30/07/2002 15:41:38

Heu je trouvé quelque chose de vraiment bizzare !!
Lorsque je veux crypter : "mon texte est en clair" avec la clé "Computer" sela me donne après décryptage "mon texte est en cl" !! Pire, lorsque j'utilise la clé  : "computer" ( tout en minuscule ) j'obtient :  "m" !!! Il semblerais que la fonction crypt renvoie le bon encryptage ( longueur correct ) mais dans la textbox txtEncrypted il en manque la fin, alors le decryptage renvoie un texte incomplet...
Je n'ai pas trouvé d'autres exemples qui me donne la même chose, c'est peut-être un cas à part... Bon voila si il y en a qui veulent joué avec ça....

Commentaire de lolo32 le 30/07/2002 18:30:22

Ce probleme vient du fait que le texte, une fois crypte, se retrouve sous la forme binaire.
Ainsi, la chaine est complete, mais le 20eme caractere est le caractere chr(0), et indique ainsi la fin de la chaine pour le text (meme explication pour le 2eme caractere du second exemple).

Commentaire de bigane le 30/07/2002 19:40:08

Bonsoir Lolo32,
Tant pis pour le mod avec les parenthèses c'était juste pour éviter les confusions.
Bravo, ce code est maintenant correct.
En réponse à TheBabyCool (qui lit l'anglais je présume vu son pseudo) :
<<
RC4 is a stream cipher designed by Rivest for RSA Data Security (now RSA Security). It is a variable key-size stream cipher with byte-oriented operations. The algorithm is based on the use of a random permutation. Analysis shows that the period of the cipher is overwhelmingly likely to be greater than 10100. Eight to sixteen machine operations are required per output byte, and the cipher can be expected to run very quickly in software. Independent analysts have scrutinized the algorithm and it is considered secure.
http://www.rsasecurity.com/rsalabs/faq/3-6-3.html
>>

Et c'est bien le code du RC4, sans ajout, sans modif, mais en VB (4, 5 6, et VBA)
Note 9/10.
Bigane

Commentaire de bigane le 30/07/2002 20:00:50

Encore un mot :
Ici  http://wombat.doc.ic.ac.uk/foldoc/foldoc.cgi?RC4, il est dit que le RC4 en version exportable des US (limité avec une clé de 40 bits) est cassé en 8 jours par deux universités. Le terme RC4 est interdit d'utilisation dans un logiciel sans payer des droits. L'algo du RC4 n'a jamais été divulgé officiellement et ce code peut donc être utilisé sans garantie de la RSA Data Security, mais uniquement si vous ne mentionnez pas que c'est du RC4.

A Utiliser avec key >= 128 bits (16 octets) au minimum donc (et pas que de l'alpha).

Bigane

Commentaire de got le 10/09/2002 19:27:15

si je crypte un texte avec des maj elle ressorte decrypter en miniscule normal comment faire pour palier a ça???

Commentaire de Gorgot le 27/12/2002 12:22:28

tit commentaire... si tu cripte disons AAAAAA ak la key AAA et que tu le décrypte ak juste AA ben ils vas te resortir le meme AAAAAA pareil... Bug du prog ou du RC4?

Commentaire de lolo32 le 28/12/2002 10:09:59

C'est normal.
Le tableau d'octet est recomposé à partir de la clé. Or, celui-ci est constitué à partir de la clé. Si la clé ne contient que les mêmes lettre, le cryptage sera identique. ainsi, tu obtiendra le même résultat avec la clé A ou avec la clé AAAAAAAAAAAAAAAAAAAAAAAA.
C'est le cryptage qui est fait ainsi.

Commentaire de cygen le 19/12/2003 15:14:21

Je serais curieux de voir le même programme en C, possiblité de transcription si'l vous plaît ?? :) en ce qui concerne ce code en vb il fontionne merveilleusement bien.

Commentaire de lolo32 le 22/12/2003 13:39:24

Je suis en train de le traduire en C et en C++ (utilisation de classe)

Commentaire de cygen le 22/12/2003 14:33:53

On peut t'envoyer un email ??? pour des renseignements.

Commentaire de Philippe734 le 08/08/2004 13:25:14

que ce soit du RC4 ou non, merci car c'est juste ce que je cherchai ; crypter et décrypter un string :-)

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,154 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales