AES encryption/decryption
18,689
Solution 1
I am using this (found on Google) for strings AES Encryption/Decryption:
Imports System.Security.Cryptography
Namespace TextCrypters
Public Class AESCrypter
Public Shared pass As String = "password"
Public Shared Function AES_Encrypt(ByVal input 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 = 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
Return Nothing
End Try
End Function
Public Shared Function AES_Decrypt(ByVal input 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 = 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
Return Nothing
End Try
End Function
End Class
End Namespace
To use it just do this:
Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
TextBox2.Text = AESCrypter.AES_Encrypt(TextBox1.Text)
End Sub
Protected Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
TextBox4.Text = AESCrypter.AES_Decrypt(TextBox3.Text)
End Sub
Solution 2
Just copy everything in a new function starting from Dim ByteCount As Integer = 0
to SymmetricKey.Clear()
to get rid of all strings? After that you only need to define the arguments to the function.
Author by
Simon Canning
Updated on November 21, 2022Comments
-
Simon Canning over 1 year
Here is some code that works well for strings:
Public Function AESEncrypt(ByVal PlainText As String, ByVal Password As String, ByVal salt As String) Dim HashAlgorithm As String = "SHA1" 'Can be SHA1 or MD5 Dim PasswordIterations As String = 2 Dim InitialVector As String = "CanEncryption123" 'This should be a string of 16 ASCII characters. Dim KeySize As Integer = 256 'Can be 128, 192, or 256. If (String.IsNullOrEmpty(PlainText)) Then Return "" Exit Function End If Dim InitialVectorBytes As Byte() = Encoding.ASCII.GetBytes(InitialVector) Dim SaltValueBytes As Byte() = Encoding.ASCII.GetBytes(salt) Dim PlainTextBytes As Byte() = Encoding.UTF8.GetBytes(PlainText) Dim DerivedPassword As PasswordDeriveBytes = New PasswordDeriveBytes(Password, SaltValueBytes, HashAlgorithm, PasswordIterations) Dim KeyBytes As Byte() = DerivedPassword.GetBytes(KeySize / 8) Dim SymmetricKey As RijndaelManaged = New RijndaelManaged() SymmetricKey.Mode = CipherMode.CBC Dim CipherTextBytes As Byte() = Nothing Using Encryptor As ICryptoTransform = SymmetricKey.CreateEncryptor(KeyBytes, InitialVectorBytes) Using MemStream As New MemoryStream() Using CryptoStream As New CryptoStream(MemStream, Encryptor, CryptoStreamMode.Write) CryptoStream.Write(PlainTextBytes, 0, PlainTextBytes.Length) CryptoStream.FlushFinalBlock() CipherTextBytes = MemStream.ToArray() MemStream.Close() CryptoStream.Close() End Using End Using End Using SymmetricKey.Clear() Return Convert.ToBase64String(CipherTextBytes) End Function Public Function AESDecrypt(ByVal CipherText As String, ByVal password As String, ByVal salt As String) As String Dim HashAlgorithm As String = "SHA1" Dim PasswordIterations As String = 2 Dim InitialVector As String = "CanEncryption123" Dim KeySize As Integer = 256 If (String.IsNullOrEmpty(CipherText)) Then Return "" End If Dim InitialVectorBytes As Byte() = Encoding.ASCII.GetBytes(InitialVector) Dim SaltValueBytes As Byte() = Encoding.ASCII.GetBytes(salt) Dim CipherTextBytes As Byte() = Convert.FromBase64String(CipherText) Dim DerivedPassword As PasswordDeriveBytes = New PasswordDeriveBytes(password, SaltValueBytes, HashAlgorithm, PasswordIterations) Dim KeyBytes As Byte() = DerivedPassword.GetBytes(KeySize / 8) Dim SymmetricKey As RijndaelManaged = New RijndaelManaged() SymmetricKey.Mode = CipherMode.CBC Dim PlainTextBytes As Byte() = New Byte(CipherTextBytes.Length - 1) {} Dim ByteCount As Integer = 0 Using Decryptor As ICryptoTransform = SymmetricKey.CreateDecryptor(KeyBytes, InitialVectorBytes) Using MemStream As MemoryStream = New MemoryStream(CipherTextBytes) Using CryptoStream As CryptoStream = New CryptoStream(MemStream, Decryptor, CryptoStreamMode.Read) ByteCount = CryptoStream.Read(PlainTextBytes, 0, PlainTextBytes.Length) MemStream.Close() CryptoStream.Close() End Using End Using End Using SymmetricKey.Clear() Return Encoding.UTF8.GetString(PlainTextBytes, 0, ByteCount) End Function
Can I have some help in modifying these functions to encrypt/decrypt byte arrays rather than strings. Also, to have the functions return the encrypted/decrypted byte array, rather than a string.
thanks
-
Simon Canning about 12 yearsWould that approach be just as efficient/effective as modifying the function to accept byte arrays rather than string?
-
TonyK about 12 yearsAs efficient? No. But I don't think the overhead will be heavy. As effective? Yes.
-
Simon Canning about 12 yearsI have used the conversion functions to convert the byte array to string and vica-versa. For some reason, if I try and decrypt an encrypted byte array (from a file), it is not the same as the original file. Are there any limitations to using those conversion routines?
-
Simon Canning about 12 yearsAlso, some files do not work. I get this error: "The input is not a valid Base-64 string as it contains a non-base 64 character, more than two padding characters, or a non-white space character among the padding characters."
-
Simon Canning about 12 yearsHow about the encrypt function for the byte array. :)
-
CodesInChaos over 11 yearsThat code may "work" but it's certainly not secure(ECB mode), and it corrupts any input that contains non ASCII characters.