Rc4 encrypt/decrypt fonction

5/5 (6 avis)

Snippet vu 20 307 fois - Téléchargée 22 fois

Contenu du snippet

Ce code sert a encrypter ou decrypter des strings avec un mot de passe. Baser sur le RC4.

Rapide, efficace, sécuritaire et 100% vb.

Source / Exemple :


Public Function RC4Encrypt(text As String, encryptkey As String)
    Dim sbox(256)
    Dim key(256)
    Dim temp As Integer
    Dim a As Long
    Dim i As Integer
    Dim j As Integer
    Dim k As Integer
    Dim cipherby As Integer
    Dim cipher As String
    
    i = 0
    j = 0
    
    RC4Initialize encryptkey, key, sbox
    
    For a = 1 To Len(text)
        i = (i + 1) Mod 256
        j = (j + sbox(i)) Mod 256
        temp = sbox(i)
        sbox(i) = sbox(j)
        sbox(j) = temp

        k = sbox((sbox(i) + sbox(j)) Mod 256)

        cipherby = (Asc(Mid$(text, a, 1))) Xor k
        If Len(Hex(cipherby)) = 1 Then
            cipher = cipher & "0" & Hex(cipherby)
        Else
            cipher = cipher & Hex(cipherby)
        End If
    Next

    RC4Encrypt = cipher
End Function

Public Function RC4Decrypt(text, encryptkey)
    Dim sbox(256) As Integer
    Dim key(256) As Integer
    Dim Text2 As String
    Dim temp As Integer
    Dim a As Long
    Dim i As Integer
    Dim j As Integer
    Dim k As Long
    Dim w As Integer
    Dim cipherby As Integer
    Dim cipher As String
    
    For w = 1 To Len(text) Step 2
        Text2 = Text2 & Chr(Dec(Mid$(text, w, 2)))
    Next
    
    i = 0
    j = 0

    RC4Initialize encryptkey, key, sbox

    For a = 1 To Len(Text2)
        i = (i + 1) Mod 256
        j = (j + sbox(i)) Mod 256
        temp = sbox(i)
        sbox(i) = sbox(j)
        sbox(j) = temp

        k = sbox((sbox(i) + sbox(j)) Mod 256)

        cipherby = Asc(Mid$(Text2, a, 1)) Xor k
        cipher = cipher & Chr(cipherby)
    Next
    
    RC4Decrypt = cipher
End Function

Public Function RC4Initialize(strPwd, ByRef key, ByRef sbox)
    Dim tempSwap
    Dim a
    Dim b
    Dim intlength As Long

    intlength = Len(strPwd)
    For a = 0 To 255
        key(a) = Asc(Mid$(strPwd, a Mod intlength + 1, 1))
        sbox(a) = a
    Next

    b = 0
    For a = 0 To 255
        b = (b + sbox(a) + key(a)) Mod 256
        tempSwap = sbox(a)
        sbox(a) = sbox(b)
        sbox(b) = tempSwap
    Next
End Function
    
Public Function Dec(number) As String
    Dim base As String
    Dim iLen As Integer
    Dim iReturn As Long
    Dim i As Long
    Dim iTemp As String
    
    base = "0123456789ABCDEF"
    iLen = Len(number)
    
    For i = 0 To iLen - 1
        iTemp = Mid$(number, iLen - i, 1)
        iReturn = iReturn + (16 ^ i) * (InStr(1, base, iTemp) - 1)
    Next
    
    Dec = iReturn
End Function

Conclusion :


Utiliser comme ceci:

StringEncrypte = RC4Encrypt("message secret", "mot de passe")
StringDecrypte = RC4Decrypt(StringEncrypte, "mot de passe")

A voir également

Ajouter un commentaire Commentaires
on peut ajouter des caractere ? (appres la suite 0123456789ABCDEF)
christian_grandjean Messages postés 25 Date d'inscription dimanche 7 novembre 2004 Statut Membre Dernière intervention 19 novembre 2013 2
24 juil. 2008 à 09:29
Bonjour à tous, j'ai corrigé le code en mettant des types aux variables mais toujours pas de commentaires pas eu le temps de complèter.

'
' http://www.vbfrance.com/code.aspx?ID=41581
'
Module RC4EncryptDecrypt
Public Function RC4Encrypt(ByVal text As String, ByVal encryptkey As String) As String
Dim sbox(256) As Integer
Dim key(256) As Integer
Dim temp As Integer
Dim a As Long
Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim cipherby As Integer
Dim cipher As String = String.Empty

i = 0
j = 0

RC4Initialize(encryptkey, key, sbox)

For a = 1 To Len(text)
i = (i + 1) Mod 256
j = (j + sbox(i)) Mod 256
temp = sbox(i)
sbox(i) = sbox(j)
sbox(j) = temp
k = sbox((sbox(i) + sbox(j)) Mod 256)
cipherby = (Asc(Mid$(text, a, 1))) Xor k
If Len(Hex(cipherby)) = 1 Then
cipher = cipher & "0" & Hex(cipherby)
Else
cipher = cipher & Hex(cipherby)
End If
Next
Return cipher
End Function

Public Function RC4Decrypt(ByVal text, ByVal encryptkey) As String
Dim sbox(256) As Integer
Dim key(256) As Integer
Dim Text2 As String = String.Empty
Dim temp As Integer
Dim a As Long
Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim cipherby As Integer
Dim cipher As String = String.Empty

For w = 1 To Len(text) Step 2
Text2 = Text2 & Chr(Dec(Mid$(text, w, 2)))
Next

i = 0
j = 0
RC4Initialize(encryptkey, key, sbox)
For a = 1 To Len(Text2)
i = (i + 1) Mod 256
j = (j + sbox(i)) Mod 256
temp = sbox(i)
sbox(i) = sbox(j)
sbox(j) = temp
k = sbox((sbox(i) + sbox(j)) Mod 256)
cipherby = Asc(Mid$(Text2, a, 1)) Xor k
cipher = cipher & Chr(cipherby)
Next

Return cipher
End Function

Public Sub RC4Initialize(ByVal strPwd, ByRef key, ByRef sbox)
Dim tempSwap As Integer
Dim a As Integer
Dim b As Integer
Dim intlength As Integer
intlength = Len(strPwd)

For a = 0 To 255
key(a) = Asc(Mid$(strPwd, a Mod intlength + 1, 1))
sbox(a) = a
Next
b = 0
For a = 0 To 255
b = (b + sbox(a) + key(a)) Mod 256
tempSwap = sbox(a)
sbox(a) = sbox(b)
sbox(b) = tempSwap
Next

End Sub

Public Function Dec(ByVal number) As String
Dim base As String
Dim iLen As Integer
Dim iReturn As Long
Dim iTemp As String

base = "0123456789ABCDEF"
iLen = Len(number)

For i = 0 To iLen - 1
iTemp = Mid$(number, iLen - i, 1)
iReturn = iReturn + (16 ^ i) * (InStr(1, base, iTemp) - 1)
Next

Return iReturn
End Function
End Module
bgdesigner Messages postés 6 Date d'inscription mardi 2 janvier 2007 Statut Membre Dernière intervention 18 avril 2008
22 avril 2008 à 14:37
Aussi
Vous feriez mieux en commentant le code, surtout pour ce qui est de son utilisation (dans la la rubrique Description).
Bonne continuation
Merci
bgdesigner Messages postés 6 Date d'inscription mardi 2 janvier 2007 Statut Membre Dernière intervention 18 avril 2008
22 avril 2008 à 14:17
Je note 17/20
bgdesigner Messages postés 6 Date d'inscription mardi 2 janvier 2007 Statut Membre Dernière intervention 18 avril 2008
22 avril 2008 à 14:14
Je viens de tester ce code avec VBA.
Je signale qu'à part quelques variables à déclarer
* variables i et w comme compteurs : as integer
* iTemp as String dans Function Dec
* intlength As Integer dans Function RC4Initialize
aussi que la fonction RC4Initialize peut être simplement locale (Private) car on a besoin, niveau appel, que des 2 fonction RC4Encrypt et RC4Decrypt

Le tout marche très bien : cryptage et décryptage.
C'est d'utilisation simple et trés pratique
Merci
Afficher les 6 commentaires

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.