web-dev-qa-db-fra.com

AES Encrypt String in VB.NET

J'ai un programme basé sur Visual Basic 2010.

Je souhaite utiliser un mot-clé personnalisé et le cryptage AES pour générer des clés d'enregistrement sur le site Web de notre société, qui déverrouilleront le logiciel, que le logiciel soit connecté ou non à Internet.

Pour ce faire, je souhaite chiffrer certaines informations utilisateur (et un code de validation) dans une chaîne cryptée AES à l'aide d'un utilitaire que je créerai sur mon site Web. Ensuite, je souhaite que mon programme déchiffre la chaîne en informations d’utilisateur et en code de validation, puis utilise ces informations pour valider la clé d’enregistrement.

Ce qui m'amène à la question: comment chiffrer et déchiffrer une chaîne dans AES par programme? Existe-t-il un modèle de code que je peux utiliser quelque part ou une méthode intégrée?

17
CodeMouse92

Une recherche rapide dans Google fait apparaître les fonctions suivantes: Je n'ai pas vérifié si le résultat généré est correct, mais elles semblent avoir été compilées correctement.

Public Function AES_Encrypt(ByVal input As String, ByVal pass As String) As String
        Dim AES As New System.Security.Cryptography.RijndaelManaged
        Dim Hash_AES As New System.Security.Cryptography.MD5CryptoServiceProvider
        Dim encrypted As String = ""
        Try
            Dim hash(31) As Byte
            Dim temp As Byte() = Hash_AES.ComputeHash(System.Text.ASCIIEncoding.ASCII.GetBytes(pass))
            Array.Copy(temp, 0, hash, 0, 16)
            Array.Copy(temp, 0, hash, 15, 16)
            AES.Key = hash
            AES.Mode = Security.Cryptography.CipherMode.ECB
            Dim DESEncrypter As System.Security.Cryptography.ICryptoTransform = AES.CreateEncryptor
            Dim Buffer As Byte() = System.Text.ASCIIEncoding.ASCII.GetBytes(input)
            encrypted = Convert.ToBase64String(DESEncrypter.TransformFinalBlock(Buffer, 0, Buffer.Length))
            Return encrypted
        Catch ex As Exception
        End Try
    End Function

Public Function AES_Decrypt(ByVal input As String, ByVal pass As String) As String
        Dim AES As New System.Security.Cryptography.RijndaelManaged
        Dim Hash_AES As New System.Security.Cryptography.MD5CryptoServiceProvider
        Dim decrypted As String = ""
        Try
            Dim hash(31) As Byte
            Dim temp As Byte() = Hash_AES.ComputeHash(System.Text.ASCIIEncoding.ASCII.GetBytes(pass))
            Array.Copy(temp, 0, hash, 0, 16)
            Array.Copy(temp, 0, hash, 15, 16)
            AES.Key = hash
            AES.Mode = Security.Cryptography.CipherMode.ECB
            Dim DESDecrypter As System.Security.Cryptography.ICryptoTransform = AES.CreateDecryptor
            Dim Buffer As Byte() = Convert.FromBase64String(input)
            decrypted = System.Text.ASCIIEncoding.ASCII.GetString(DESDecrypter.TransformFinalBlock(Buffer, 0, Buffer.Length))
            Return decrypted
        Catch ex As Exception
        End Try
    End Function

Source: http://www.l33thackers.com/Thread-VB-NET-AES-Encryption

29
Shane Gowland

Edit: Merci à Artjom B. pour m'avoir notifié une erreur de déchiffrement de AES-CBC due à ma fausse hypothèse selon laquelle les chaînes de caractères IV se terminent toujours par == (en Base64), ce qui est faux. Merci à Kanky pour avoir abordé ce sujet et merci à Misery pour lui avoir proposé une solution dans ce lien . Notez que je n'ai pas vérifié sa solution moi-même, mais j'espère que c'est correct.

Vous trouverez ci-dessous deux solutions pour chiffrer des chaînes avec AES . La première utilise le mode CBC avec un IV généré automatiquement et est plus sécurisée. L'utilisation du mode IV avec le mode CBC garantit que même les mêmes paires de clés en texte clair donnent lieu à des textes cryptographiques distincts, ce qui le rend plus sécurisé .. La seconde utilise davantage la BCE et ne doit pas être utilisée pour le cryptage répétitif en texte brut .. AES .Key est généré en hachant la chaîne de clé d'entrée avec SHA256; vous n'avez donc pas à vous soucier de la pseudo aléatoire de votre clé.

Celui-ci est AES-CBC. IV est généré automatiquement par la fonction intégrée et concaténé avec le texte chiffré et renvoyé en tant que sortie de l'algorithme de chiffrement. L'algorithme de déchiffrement divise ce texte concaténé pour récupérer l'IV et le texte chiffré réel.

Private Function AESE(ByVal plaintext As String, ByVal key As String) As String
    Dim AES As New System.Security.Cryptography.RijndaelManaged
    Dim SHA256 As New System.Security.Cryptography.SHA256Cng
    Dim ciphertext As String = ""
    Try
        AES.GenerateIV()
        AES.Key = SHA256.ComputeHash(System.Text.ASCIIEncoding.ASCII.GetBytes(key))

        AES.Mode = Security.Cryptography.CipherMode.CBC
        Dim DESEncrypter As System.Security.Cryptography.ICryptoTransform = AES.CreateEncryptor
        Dim Buffer As Byte() = System.Text.ASCIIEncoding.ASCII.GetBytes(plaintext)
        ciphertext = Convert.ToBase64String(DESEncrypter.TransformFinalBlock(Buffer, 0, Buffer.Length))

       Return Convert.ToBase64String(AES.IV) & Convert.ToBase64String(DESEncrypter.TransformFinalBlock(Buffer, 0, Buffer.Length))

    Catch ex As Exception
        Return ex.Message
    End Try
End Function

Private Function AESD(ByVal ciphertext As String, ByVal key As String) As String
    Dim AES As New System.Security.Cryptography.RijndaelManaged
    Dim SHA256 As New System.Security.Cryptography.SHA256Cng
    Dim plaintext As String = ""
    Dim iv As String = ""
    Try
        Dim ivct = ciphertext.Split({"=="}, StringSplitOptions.None)
        iv = ivct(0) & "=="
        ciphertext = If(ivct.Length = 3, ivct(1) & "==", ivct(1))

        AES.Key = SHA256.ComputeHash(System.Text.ASCIIEncoding.ASCII.GetBytes(key))
        AES.IV = Convert.FromBase64String(iv)
        AES.Mode = Security.Cryptography.CipherMode.CBC
        Dim DESDecrypter As System.Security.Cryptography.ICryptoTransform = AES.CreateDecryptor
        Dim Buffer As Byte() = Convert.FromBase64String(ciphertext)
        plaintext = System.Text.ASCIIEncoding.ASCII.GetString(DESDecrypter.TransformFinalBlock(Buffer, 0, Buffer.Length))
        Return plaintext
    Catch ex As Exception
        Return ex.Message
    End Try
End Function

Celui ci-dessous est le mode AES-ECB. Il n'utilise pas un IV. Les mêmes textes en clair produisent toujours les mêmes textes chiffrés (sous la même clé, bien sûr) et inversement.

Private Function AESE(ByVal input As Byte(), ByVal key As String) As Byte()
    Dim AES As New System.Security.Cryptography.RijndaelManaged
    Dim SHA256 As New System.Security.Cryptography.SHA256Cng
    Dim ciphertext As String = ""
    Try
        AES.Key = SHA256.ComputeHash(System.Text.ASCIIEncoding.ASCII.GetBytes(key))
        AES.Mode = Security.Cryptography.CipherMode.ECB
        Dim DESEncrypter As System.Security.Cryptography.ICryptoTransform = AES.CreateEncryptor
        Dim Buffer As Byte() = input
        Return DESEncrypter.TransformFinalBlock(Buffer, 0, Buffer.Length)
    Catch ex As Exception
    End Try
End Function

Private Function AESD(ByVal input As Byte(), ByVal key As String) As Byte()
    Dim AES As New System.Security.Cryptography.RijndaelManaged
    Dim SHA256 As New System.Security.Cryptography.SHA256Cng
    Try
        AES.Key = SHA256.ComputeHash(System.Text.ASCIIEncoding.ASCII.GetBytes(key))
        AES.Mode = Security.Cryptography.CipherMode.ECB
        Dim DESDecrypter As System.Security.Cryptography.ICryptoTransform = AES.CreateDecryptor
        Dim Buffer As Byte() = input
        Return DESDecrypter.TransformFinalBlock(Buffer, 0, Buffer.Length)
    Catch ex As Exception
    End Try
End Function
6
Ussiane Lepsiq

Vous trouverez ci-dessous deux exemples de chiffrement AES et 3DES. Ceux-ci utilisent des tableaux d'octets en entrée et en sortie, mais vous pouvez facilement les modifier pour gérer les chaînes. À titre de bonne pratique, vous devez toujours générer le vecteur d’initialisation (IV) et l’ajouter au fichier de sortie pour le déchiffrement. Cela aide à protéger votre clé des attaques par force brute. Il est également préférable d'utiliser CBC plutôt que EBC pour le mode de chiffrement.

Imports System.Security.Cryptography
Imports System.Text

Public Class CAes
    '************************************************************************************************
    'Functions for AES Encryption
    '************************************************************************************************
    Public Function AES_Encrypt(ByVal value As Byte(), ByVal key As String) As Byte()
        Dim AES As New RijndaelManaged
        Dim SHA256 As New SHA256Cng
        Dim output() As Byte

        AES.GenerateIV()
        Dim iv() As Byte = AES.IV
        AES.Key = SHA256.ComputeHash(ASCIIEncoding.ASCII.GetBytes(key))

        AES.Mode = CipherMode.CBC
        Dim AESEncrypter As ICryptoTransform = AES.CreateEncryptor
        Dim Buffer As Byte() = value
        output = AESEncrypter.TransformFinalBlock(Buffer, 0, Buffer.Length)

        'Copy the IV as the first 16 bytes of the output then copy encrypted bytes
        Dim ivAndOutput(output.Length - 1 + 16) As Byte
        Array.Copy(iv, ivAndOutput, 16)
        Array.Copy(output, 0, ivAndOutput, 16, output.Length)

        Return ivAndOutput

    End Function

    Public Function AES_Decrypt(ByVal value As Byte(), ByVal key As String) As Byte()
        Dim AES As New RijndaelManaged
        Dim SHA256 As New SHA256Cng
        Dim output() As Byte
        Dim iv(15) As Byte
        Dim Buffer(value.Length - 1 - 16) As Byte

        'Extract first 16 bytes of input stream as IV.  Copy remaining bytes into encrypted buffer
        Array.Copy(value, iv, 16)
        Array.Copy(value, 16, Buffer, 0, value.Length - 16)

        AES.Key = SHA256.ComputeHash(ASCIIEncoding.ASCII.GetBytes(key))
        AES.IV = iv
        AES.Mode = CipherMode.CBC
        Dim AESDecrypter As ICryptoTransform = AES.CreateDecryptor
        output = AESDecrypter.TransformFinalBlock(Buffer, 0, Buffer.Length)
        Return output

    End Function
End Class

Public Class C3Des

    '************************************************************************************************
    'Functions for 3DES Encryption
    '************************************************************************************************
    Public Function DES_Encrypt(ByVal value As Byte(), ByVal key As String) As Byte()
        Dim m As MD5 = New MD5CryptoServiceProvider
        Dim d As TripleDES = New TripleDESCryptoServiceProvider
        Dim encryptBytes() As Byte
        d.Key = m.ComputeHash(Encoding.Unicode.GetBytes(key))
        d.GenerateIV()
        Dim c As ICryptoTransform = d.CreateEncryptor
        Dim input() As Byte = value
        encryptBytes = c.TransformFinalBlock(input, 0, input.Length)
        Dim outBytes(encryptBytes.Length + d.IV.Length - 1) As Byte
        Array.Copy(d.IV, outBytes, d.IV.Length)
        Array.Copy(encryptBytes, 0, outBytes, 8, encryptBytes.Length)
        Return outBytes
    End Function

    Public Function DES_Decrypt(ByVal value As Byte(), ByVal key As String) As Byte()
        Dim m As MD5 = New MD5CryptoServiceProvider
        Dim d As TripleDES = New TripleDESCryptoServiceProvider
        Dim encryptBytes(value.Length - 9), iv(7) As Byte
        Array.Copy(value, 0, iv, 0, 8)
        Array.Copy(value, 8, encryptBytes, 0, value.Length - 8)
        d.Key = m.ComputeHash(Encoding.Unicode.GetBytes(key))
        d.IV = iv
        Dim b As Byte() = encryptBytes
        Dim c As ICryptoTransform = d.CreateDecryptor
        Dim output() As Byte = c.TransformFinalBlock(b, 0, b.Length)
        Return output
    End Function
End Class
0
user3034017

Vous pouvez utiliser le mode CBC pour chiffrer des fichiers avec une relative facilité. Utilisez uuencode/uudecode pour convertir un fichier binaire en une représentation textuelle et inversement. Voir les informations relatives ici: http://www.nullskull.com/a/237/uuencode-and-uudecode-in-vbnet-and-c.aspx Et ici: https: // social.msdn.Microsoft.com/Forums/vstudio/en-US/5d4eaed8-1984-4639-aebb-bb2afddbfb8a/how-to-uuencodeuudecode-in-vbnet?forum=vbgeneral

0
Will Pepponi