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?
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
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
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
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