Rijndael Encryption and Decryption does not work on another computer - vb.net

First of all, if i do encryption and decryption on the same computer, it works fine. Bu when i want to decrypt a file which encrypted on another computer with same key, it does not work. Error tells 'Parameter is invalid'. Here are the defines;
Dim cspp As New CspParameters
Dim rsa As New RSACryptoServiceProvider
Dim bVis As New baseVisitor
Dim encDec As New EncryptDecrypt
Public encFolder As String = ""
Public decFolder As String = ""
Public keyName As String = ""
Here is how can i define key;
Public Function GetKey() As Boolean
Dim sonuc As Boolean = False
Try
keyName = "keyName25*-"
If keyName.Length > 4 Then
cspp.KeyContainerName = keyName
rsa = New RSACryptoServiceProvider(cspp)
rsa.PersistKeyInCsp = True
sonuc = True
End If
Catch ex As Exception
sonuc = False
End Try
Return sonuc
End Function
After getting key here is the encryption code;
Public Sub EncryptFile(ByVal decFile As String)
Dim rjndl As RijndaelManaged = New RijndaelManaged()
rjndl.KeySize = 256
rjndl.BlockSize = 256
rjndl.Mode = CipherMode.CBC
Dim transform As ICryptoTransform = rjndl.CreateEncryptor()
Dim keyEncrypted As Byte() = rsa.Encrypt(rjndl.Key, False)
Dim LenK As Byte() = New Byte(3) {}
Dim LenIV As Byte() = New Byte(3) {}
Dim lKey As Integer = keyEncrypted.Length
LenK = BitConverter.GetBytes(lKey)
Dim lIV As Integer = rjndl.IV.Length
LenIV = BitConverter.GetBytes(lIV)
Dim startFileName As Integer = decFile.LastIndexOf("\") + 1
Dim outFile As String = decFile
Using outFs As FileStream = New FileStream(outFile, FileMode.Create)
outFs.Write(LenK, 0, 4)
outFs.Write(LenIV, 0, 4)
outFs.Write(keyEncrypted, 0, lKey)
outFs.Write(rjndl.IV, 0, lIV)
Using outStreamEncrypted As CryptoStream = New CryptoStream(outFs, transform, CryptoStreamMode.Write)
Dim count As Integer = 0
Dim offset As Integer = 0
Dim blockSizeBytes As Integer = rjndl.BlockSize / 8
Dim data As Byte() = New Byte(blockSizeBytes - 1) {}
Dim bytesRead As Integer = 0
Using inFs As FileStream = New FileStream(decFile, FileMode.Open)
Do
count = inFs.Read(data, 0, blockSizeBytes)
offset += count
outStreamEncrypted.Write(data, 0, count)
bytesRead += blockSizeBytes
Loop While count > 0
inFs.Close()
End Using
outStreamEncrypted.FlushFinalBlock()
outStreamEncrypted.Close()
End Using
outFs.Close()
End Using
End Sub
Encryption works for all computers. But Decription code which is below is the problem;
Public Sub DecryptFile(ByVal enFile As String)
Dim rjndl As RijndaelManaged = New RijndaelManaged()
rjndl.KeySize = 256
rjndl.BlockSize = 256
rjndl.Mode = CipherMode.CBC
Dim LenK As Byte() = New Byte(3) {}
Dim LenIV As Byte() = New Byte(3) {}
Dim outFile As String = enFile
Using inFs As FileStream = New FileStream(enFile, FileMode.Open)
inFs.Seek(0, SeekOrigin.Begin)
inFs.Seek(0, SeekOrigin.Begin)
inFs.Read(LenK, 0, 3)
inFs.Seek(4, SeekOrigin.Begin)
inFs.Read(LenIV, 0, 3)
Dim lenK32 As Integer = BitConverter.ToInt32(LenK, 0)
Dim lenIV32 As Integer = BitConverter.ToInt32(LenIV, 0)
Dim startC As Integer = lenK32 + lenIV32 + 8
Dim lenC As Integer = CInt(inFs.Length) - startC
Dim KeyEncrypted As Byte() = New Byte(lenK32 - 1) {}
Dim IV As Byte() = New Byte(lenIV32 - 1) {}
inFs.Seek(8, SeekOrigin.Begin)
inFs.Read(KeyEncrypted, 0, lenK32)
inFs.Seek(8 + lenK32, SeekOrigin.Begin)
inFs.Read(IV, 0, lenIV32)
Dim KeyDecrypted As Byte() = rsa.Decrypt(KeyEncrypted, False)
Dim transform As ICryptoTransform = rjndl.CreateDecryptor(KeyDecrypted, IV)
Using outFs As FileStream = New FileStream(outFile, FileMode.Create)
Dim count As Integer = 0
Dim offset As Integer = 0
Dim blockSizeBytes As Integer = rjndl.BlockSize / 8
Dim data As Byte() = New Byte(blockSizeBytes - 1) {}
inFs.Seek(startC, SeekOrigin.Begin)
Using outStreamDecrypted As CryptoStream = New CryptoStream(outFs, transform, CryptoStreamMode.Write)
Do
count = inFs.Read(data, 0, blockSizeBytes)
offset += count
outStreamDecrypted.Write(data, 0, count)
Loop While count > 0
outStreamDecrypted.FlushFinalBlock()
outStreamDecrypted.Close()
End Using
outFs.Close()
End Using
inFs.Close()
End Using
End Sub
Using same key must solve the problem but it error all the time. I searched everywhere. Is there anybody to help me?
NOTE : I just want to encrypt-decrypt jpg files

Related

VB.Net Encryption Function Not Decrypting Without Using Base64Encode

I am having a issue with decrypting, my goal is to be able to encrypt/decrypt with/without base64 encoding on the encrypted string. As of now I can encrypt/decrypt with base64 and encrypt without it but not decrypt without it. I get errors regarding the padding being incorrect.
Thanks in advance!
Here is my encryption/decryption function:
Public Function DoCryptWork(Type As String, Data As String) As String
Dim Pass As String = Hasher.TextBoxPassword.Text
Dim Salt As String = Hasher.TextBoxSalt.Text
Dim Vect As String = Hasher.TextBoxIntVector.Text
Select Case Type
Case "e"
Try
Dim PassPhrase As String = Pass
Dim SaltValue As String = Salt
Dim HashAlgorithm As String = My.Settings.HashAlgorithm
Dim PasswordIterations As Integer = 2
Dim InitVector As String = Vect
Dim KeySize As Integer = 256
Dim InitVectorBytes As Byte() = Encoding.ASCII.GetBytes(InitVector)
Dim SaltValueBytes As Byte() = Encoding.ASCII.GetBytes(SaltValue)
Dim PlainTextBytes As Byte() = Encoding.UTF8.GetBytes(Data)
Dim Password As New PasswordDeriveBytes(PassPhrase, SaltValueBytes, HashAlgorithm, PasswordIterations)
Dim KeyBytes As Byte() = Password.GetBytes(KeySize \ 8)
Dim SymmetricKey As New RijndaelManaged()
SymmetricKey.Mode = CipherMode.CBC
Dim Encryptor As ICryptoTransform = SymmetricKey.CreateEncryptor(KeyBytes, InitVectorBytes)
Dim MemoryStream As New MemoryStream()
Dim CryptoStream As New CryptoStream(MemoryStream, Encryptor, CryptoStreamMode.Write)
CryptoStream.Write(PlainTextBytes, 0, PlainTextBytes.Length)
CryptoStream.FlushFinalBlock()
Dim CipherTextBytes As Byte() = MemoryStream.ToArray()
MemoryStream.Close()
CryptoStream.Close()
Dim CipherText As String = Nothing
If My.Settings.Base64EncodeMD5Hash = True Then
CipherText = Convert.ToBase64String(CipherTextBytes)
Return CipherText
Else
Dim TextCipher As New StringBuilder()
For n As Integer = 0 To CipherTextBytes.Length - 1
TextCipher.Append(CipherTextBytes(n).ToString("X2"))
Next n
CipherText = TextCipher.ToString()
Return CipherText
End If
Catch ex As Exception
MsgBox("Encryption was unsuccessfull!", MsgBoxStyle.Critical, "Error")
Return "Encryption was unsuccessfull!"
End Try
Case "d"
Try
Dim PassPhrase As String = Pass
Dim SaltValue As String = Salt
Dim HashAlgorithm As String = My.Settings.HashAlgorithm
Dim PasswordIterations As Integer = 2
Dim InitVector As String = Vect
Dim KeySize As Integer = 256
Dim InitVectorBytes As Byte() = Encoding.ASCII.GetBytes(InitVector)
Dim SaltValueBytes As Byte() = Encoding.ASCII.GetBytes(SaltValue)
Dim CipherTextBytes As Byte() = Nothing
If My.Settings.Base64EncodeMD5Hash = True Then
CipherTextBytes = Convert.FromBase64String(Data)
Else
Dim bytedata As Byte() = Encoding.UTF8.GetBytes(Data)
CipherTextBytes = bytedata
End If
Dim Password As New PasswordDeriveBytes(PassPhrase, SaltValueBytes, HashAlgorithm, PasswordIterations)
Dim KeyBytes As Byte() = Password.GetBytes(KeySize \ 8)
Dim SymmetricKey As New RijndaelManaged()
SymmetricKey.Mode = CipherMode.CBC
Dim Decryptor As ICryptoTransform = SymmetricKey.CreateDecryptor(KeyBytes, InitVectorBytes)
Dim MemoryStream As New MemoryStream(CipherTextBytes)
Dim CryptoStream As New CryptoStream(MemoryStream, Decryptor, CryptoStreamMode.Read)
Dim PlainTextBytes As Byte() = New Byte(CipherTextBytes.Length - 1) {}
Dim DecryptedByteCount As Integer = CryptoStream.Read(PlainTextBytes, 0, PlainTextBytes.Length)
MemoryStream.Close()
CryptoStream.Close()
Dim PlainText As String = Encoding.UTF8.GetString(PlainTextBytes, 0, DecryptedByteCount)
Return PlainText
Catch Ex As Exception
MsgBox("Decryption was unsuccessfull!" & vbNewLine & vbNewLine & Ex.ToString(), MsgBoxStyle.Critical, "Error")
Return "Decryption was unsuccessfull!"
End Try
Case Else
Return "Error! Invalid Case Selected We should never see this but just to be safe we'll show this message if the wrong case is selected!"
End Select
Return True
End Function
I call the function as so:
TextBoxOutput.Text = Encryption.DoCryptWork("e", TextBoxInput.Text) ' encrypt data.
TextBoxOutput.Text = Encryption.DoCryptWork("d", TextBoxInput.Text) ' decrypt data.
When you convert the bytes to hex, you output two hex digits per byte. When you convert that hex back to bytes, you're converting every hex digit to a byte instead of every pair of hex digits.
Actually, I just took another look and noticed that you're not even keeping the earlier bytes. This loop:
For n As Integer = 0 To Data.Length - 1
CipherTextBytes = Convert.ToByte(Data(n))
Next n
sets CipherTextBytes on each iteration so you're going to replace the previous byte each time, so you only end up keeping the byte from the last digit.

Length of the data to decrypt is invalid | file encryption / decryption

I am trying to make a simple file encryptor / decryptor for a project that I am working on, however when I try to decrypt a file I am getting the following error : Length of the data to decrypt is invalid (at the line cs.close())
Public Function AES_Encrypt(ByVal bytesToBeEncrypted As Byte(), ByVal passwordBytes as Byte()) As Byte()
Dim encryptedBytes as Byte() = Nothing
Dim saltBytes As Byte() = New Byte() {1, 2, 3, 4, 5, 6, 7, 8}
Using ms As New MemoryStream()
Using AES As New RijndaelManaged
AES.Keysize = 256
AES.BlockSize = 128
Dim key = New Rfc2898DeriveBytes(passwordBytes, saltBytes, 1000)
AES.Key = key.getBytes(AES.KeySize / 8)
AES.IV = key.GetBytes(AES.Blocksize / 8)
AES.Mode = CipherMode.CBC
Using cs = New CryptoStream(ms, AES.CreateEncryptor(), CryptoStreamMode.Write)
cs.Write(bytesToBeEncrypted, 0, bytesToBeEncrypted.Length)
cs.Close()
End Using
encryptedBytes = ms.ToArray
End Using
End Using
Return encryptedBytes
End Function
Public Sub EncryptFile(ByVal file As Stringm ByVal password As String)
Dim bytesToBeEncrypted As Byte() = System.IO.File.ReadAllBytes(file)
Dim passwordBytes as Byte() = Encoding.UTF8.GetBytes(password)
passwordBytes = SHA256.Create().ComputeHash(passwordBytes)
Dim bytesEncrypted as Byte() = AES_Encrypt(bytesToBeEncrypted, passwordBytes)
System.IO.File.WriteAllBytes(file, bytesEncrypted)
System.IO.File.Move(file, file + ".SECURED")
End Sub
Public Function AES_Decrypt(ByVal bytesToBeDecrypted As Byte(), ByVal passwordBytes as Byte()) As Byte()
Dim decryptedBytes as Byte() = Nothing
Dim saltBytes As Byte() = New Byte() {1, 2, 3, 4, 5, 6, 7, 8}
Using ms As New MemoryStream()
Using AES As New RijndaelManaged
AES.Keysize = 256
AES.BlockSize = 128
Dim key = New Rfc2898DeriveBytes(passwordBytes, saltBytes, 1000)
AES.Key = key.getBytes(AES.KeySize / 8)
AES.IV = key.GetBytes(AES.Blocksize / 8)
AES.Mode = CipherMode.CBC
Using cs = New CryptoStream(ms, AES.CreateDecryptor(), CryptoStreamMode.Write)
cs.Write(bytesToBeDecrypted, 0, bytesToBeDecrypted.Length)
cs.Close()
End Using
decryptedBytes = ms.ToArray
End Using
End Using
Return decryptedBytes
End Function
Public Sub DecryptFile(ByVal file As Stringm ByVal password As String)
Dim bytesToBeDecrypted As Byte() = System.IO.File.ReadAllBytes(file)
Dim passwordBytes as Byte() = Encoding.UTF8.GetBytes(password)
passwordBytes = SHA256.Create().ComputeHash(passwordBytes)
Dim bytesDecrypted as Byte() = AES_Encrypt(bytesToBeDecrypted, passwordBytes)
System.IO.File.WriteAllBytes(file, bytesDecrypted)
Dim extension As String = System.IO.Path.GetExtension(file)
Dim result As String = file.Substring(0, file.Lenth - extension.Lenth)
System.IO.File.Move(file, file + ".SECURED")
End Sub

vb.net rijndael limit to 64 character

i have problem while encrypt and decrypt using rijndael in vb.net.
it cannot work on string more than 64 character.
here is my code:
Private Function prepareRijn() As Rijndael
Dim KEY As String = Left(_KEY, 32)
Dim IV As String = Right(_KEY, 32)
Dim enc As New System.Text.UTF8Encoding
Dim byteKEY() As Byte = enc.GetBytes(KEY)
Dim byteIV() As Byte = enc.GetBytes(IV)
Dim alg As Rijndael = Rijndael.Create
alg.BlockSize = 256
alg.KeySize = 256
alg.Padding = PaddingMode.Zeros
alg.Mode = CipherMode.CBC
alg.Key = byteKEY
alg.IV = byteIV
Return alg
End Function
Function decrypt(ByVal encrypted As String) As String
encrypted = encrypted.Replace("Q2FrZQ==.", "")
Dim enc As New System.Text.UTF8Encoding
Dim alg As Rijndael = prepareRijn()
Dim ms As New MemoryStream
Dim cs As CryptoStream = New CryptoStream(ms, alg.CreateDecryptor, CryptoStreamMode.Write)
Dim data() As Byte = Convert.FromBase64String(encrypted)
cs.Write(data, 0, data.Length)
'ms.SetLength(data.Length)
Dim decrypted() As Byte
decrypted = ms.ToArray
cs.Close()
Return enc.GetString(decrypted)
End Function
Function encrypt(ByVal decrypt As String) As String
decrypt = decrypt + " "
Dim alg As Rijndael = prepareRijn()
Dim ms As New MemoryStream()
Dim cs As CryptoStream = New CryptoStream(ms, alg.CreateEncryptor(), CryptoStreamMode.Write)
Dim data() As Byte = System.Text.Encoding.UTF8.GetBytes(decrypt)
cs.Write(data, 0, data.Length)
'ms.SetLength(data.Length)
Dim encrypted() As Byte = ms.ToArray()
cs.Close()
Return Convert.ToBase64String(encrypted)
End Function
is there anything i miss during my rijndael configuration ?
I wrote complete Encryption Class for you. It works perfectly. It can be used for Both Strings and ByteArrays. This Class returns Encrypted Data in Base64, if you dont want Base64, just remove Conversion.
Imports System.Text
Imports System.Security.Cryptography
Imports System.IO
Imports System
Public Class Encryption
' Fields
Private Shared sIV As String = "Your IV Key Placed Here 32-Bytes"
Private Shared sKey As String = "Your SecKey Placed Here 32-Bytes"
' Methods
Public Shared Function DecryptRJ256(ByVal prm_text_to_decrypt As String) As String
Dim s As String = prm_text_to_decrypt
Dim managed As New RijndaelManaged With { _
.Padding = PaddingMode.Zeros, _
.Mode = CipherMode.ECB, _
.KeySize = &H100, _
.BlockSize = &H100 _
}
Dim rgbKey As Byte() = Nothing
Dim rgbIV As Byte() = Nothing
s = s.Replace("-", "+").Replace("_", "/").Replace("|", "=")
rgbKey = Encoding.ASCII.GetBytes(Encryption.sKey)
rgbIV = Encoding.ASCII.GetBytes(Encryption.sIV)
Dim transform As ICryptoTransform = managed.CreateDecryptor(rgbKey, rgbIV)
Dim buffer As Byte() = Convert.FromBase64String(s)
Dim buffer4 As Byte() = New Byte((buffer.Length + 1) - 1) {}
Dim stream As New MemoryStream(buffer)
Dim stream2 As New CryptoStream(stream, transform, CryptoStreamMode.Read)
stream2.Read(buffer4, 0, buffer4.Length)
Return Encoding.ASCII.GetString(buffer4)
End Function
Public Shared Function EncryptRJ256(ByVal prm_text_to_encrypt As String) As String
Dim s As String = prm_text_to_encrypt
Dim managed As New RijndaelManaged With { _
.Padding = PaddingMode.Zeros, _
.Mode = CipherMode.ECB, _
.KeySize = &H100, _
.BlockSize = &H100 _
}
Dim buffer As Byte() = Nothing
Dim rgbKey As Byte() = Nothing
Dim rgbIV As Byte() = Nothing
rgbKey = Encoding.ASCII.GetBytes(Encryption.sKey)
rgbIV = Encoding.ASCII.GetBytes(Encryption.sIV)
Dim transform As ICryptoTransform = managed.CreateEncryptor(rgbKey, rgbIV)
Dim stream As New MemoryStream
Dim stream2 As New CryptoStream(stream, transform, CryptoStreamMode.Write)
buffer = Encoding.ASCII.GetBytes(s)
stream2.Write(buffer, 0, buffer.Length)
stream2.FlushFinalBlock()
Return Convert.ToBase64String(stream.ToArray).Replace("+", "-").Replace("/", "_").Replace("=", "|")
End Function
Public Shared Function EncryptRJ256(ByVal ArrayByte As Byte()) As String
Dim managed As New RijndaelManaged With { _
.Padding = PaddingMode.Zeros, _
.Mode = CipherMode.ECB, _
.KeySize = &H100, _
.BlockSize = &H100 _
}
Dim rgbKey As Byte() = Nothing
Dim rgbIV As Byte() = Nothing
rgbKey = Encoding.ASCII.GetBytes(Encryption.sKey)
rgbIV = Encoding.ASCII.GetBytes(Encryption.sIV)
Dim transform As ICryptoTransform = managed.CreateEncryptor(rgbKey, rgbIV)
Dim stream As New MemoryStream
Dim stream2 As New CryptoStream(stream, transform, CryptoStreamMode.Write)
stream2.Write(ArrayByte, 0, ArrayByte.Length)
stream2.FlushFinalBlock()
Return Convert.ToBase64String(stream.ToArray).Replace("+", "-").Replace("/", "_").Replace("=", "|")
End Function
Public Shared Function getMD5Hash(ByVal input As String) As String
Dim md As MD5 = MD5.Create
Dim bytes As Byte() = Encoding.ASCII.GetBytes(input)
Dim buffer2 As Byte() = md.ComputeHash(bytes)
Dim builder As New StringBuilder
Dim i As Integer
For i = 0 To buffer2.Length - 1
builder.Append(buffer2(i).ToString("X2"))
Next i
Return builder.ToString
End Function
Public Shared Function FromBase64String(ByVal prm_text_to_decrypt As String) As String
Dim s As String = prm_text_to_decrypt
s = s.Replace("-", "+").Replace("_", "/").Replace("|", "=")
Dim buffer As Byte() = Convert.FromBase64String(s)
Return Encoding.ASCII.GetString(buffer)
End Function
End Class

AES encryption/decryption

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
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
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.
The simplest way is to use a wrapper function that just converts the byte array to a string, encrypts it with your AESEncrypt function, and converts the string back to a byte array. You can find conversion functions for VB.net here.
Edited to add: I think I got this wrong. It seems that a VB String is in Unicode format, and these translation functions convert it to/from a UTF8 byte array. Which is not what was required...
Public Function AESEncrypt(ByVal PlainBytes As Byte, 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.
Dim InitialVectorBytes As Byte() = Encoding.ASCII.GetBytes(InitialVector)
Dim SaltValueBytes As Byte() = Encoding.ASCII.GetBytes(salt)
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(PlainBytes, 0, PlainBytes.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 CipherBytes As Byte, 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 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(CipherBytes.Length - 1) {}
Dim ByteCount As Integer = 0
Using Decryptor As ICryptoTransform = SymmetricKey.CreateDecryptor(KeyBytes, InitialVectorBytes)
Using MemStream As MemoryStream = New MemoryStream(CipherBytes)
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
The code you are using actually converts the input string to byte array. This code accepts byte array.

How to make Rijndael CBC mode work in vb.net

I'm trying to make rijndael work in CBC mode. I'm not exactly sure how should I do it. I think problem in my current code is that the stream is initialized every time in the beginning of encryption, so no avalanche effect occurs (same data is encrypted twice and the output of those two encryption is the same which it should not be).
I tried to initialize the cryptostream only once but then my coded crashed because the canwrite property of cryptostream goes to false after the first write to the cryptostream.
Here is the code what I have now:
Sub Main()
Dim rij As New RijndaelManaged
Dim iv(15) As Byte
Dim key(15) As Byte
Dim secret() As Byte = {59, 60, 61}
Dim cs As ICryptoTransform
Dim cstream As CryptoStream
Dim out() As Byte
Dim NewRandom As New RNGCryptoServiceProvider()
NewRandom.GetBytes(iv)
NewRandom.GetBytes(key)
rij = New RijndaelManaged()
rij.KeySize = 128
rij.Padding = PaddingMode.PKCS7
rij.Mode = CipherMode.CBC
rij.IV = iv
rij.Key = key
cs = rij.CreateEncryptor()
Dim ms_in As New MemoryStream
cstream = New CryptoStream(ms_in, cs, CryptoStreamMode.Write)
Using cstream
cstream.Write(secret, 0, 3)
End Using
out = ms_in.ToArray
Console.WriteLine(ArrayToString(out, out.Length))
Erase out
ms_in = New MemoryStream
cstream = New CryptoStream(ms_in, cs, CryptoStreamMode.Write)
Using cstream
cstream.Write(secret, 0, 3)
End Using
out = ms_in.ToArray
Console.WriteLine(ArrayToString(out, out.Length))
End Sub
and the conversion function to convert an array to string
Public Function ArrayToString(ByVal bytes() As Byte, ByVal length As Integer) As String
If bytes.Length = 0 Then Return String.Empty
Dim sb As New System.Text.StringBuilder(length)
Dim k As Integer = length - 1
Dim i As Integer
For i = 0 To k
sb.Append(Chr(bytes(i)))
Next
Return sb.ToString()
End Function
This is what I need:
cs = rij.CreateEncryptor()
Dim ms_in As New MemoryStream
cstream = New CryptoStream(ms_in, cs, CryptoStreamMode.Write)
Using cstream
cstream.Write(secret, 0, 3) 'encrypt
End Using
out = ms_in.ToArray
Console.WriteLine(ArrayToString(out, out.Length)) 'see the encrypted message
Erase out
Using cstream
cstream.Write(secret, 0, 3) 'encrypt, this will crash here and this is the problem I'm trying to solve
End Using
out = ms_in.ToArray
Console.WriteLine(ArrayToString(out, out.Length)) 'see the encrypted message this should not be the same as the first one
Try this:
Public Sub Run()
Dim key() As Byte = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}
Dim plaintext1 As Byte() = {59, 60, 61}
Dim plaintext2 As Byte() = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15, _
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15, _
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15, _
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 _
}
Roundtrip(plaintext1, key)
System.Console.WriteLine()
Roundtrip(plaintext2, key)
End Sub
Public Sub Roundtrip(ByRef plaintext As Byte(), ByRef key As Byte())
Dim rij As New RijndaelManaged
Dim iv(15) As Byte
Dim encryptor As ICryptoTransform
Dim decryptor As ICryptoTransform
Dim out() As Byte
'Dim NewRandom As New RNGCryptoServiceProvider()
'NewRandom.GetBytes(iv)
'NewRandom.GetBytes(key)
Console.WriteLine("Original:")
Console.WriteLine(ArrayToString(plaintext))
System.Console.WriteLine()
rij = New RijndaelManaged()
rij.KeySize = key.Length * 8 ' 16 byte key == 128 bits
rij.Padding = PaddingMode.PKCS7
rij.Mode = CipherMode.CBC
rij.IV = iv
rij.Key = key
encryptor = rij.CreateEncryptor()
Using msIn = New MemoryStream
Using cstream = New CryptoStream(msIn, encryptor, CryptoStreamMode.Write)
cstream.Write(plaintext, 0, plaintext.Length)
End Using
out = msIn.ToArray
Console.WriteLine("Encrypted:")
Console.WriteLine("{0}", ArrayToString(out))
System.Console.WriteLine()
End Using
decryptor = rij.CreateDecryptor()
Using msIn = New MemoryStream
Using cstream = New CryptoStream(msIn, decryptor, CryptoStreamMode.Write)
cstream.Write(out, 0, out.Length)
End Using
out = msIn.ToArray
Console.WriteLine("Decrypted: ")
Console.WriteLine("{0}", ArrayToString(out))
System.Console.WriteLine()
End Using
End Sub
Public Shared Function ArrayToString(ByVal bytes As Byte()) As String
Dim sb As New System.Text.StringBuilder()
Dim i As Integer
For i = 0 To bytes.Length-1
if (i <> 0 AND i mod 16 = 0) Then
sb.Append(Environment.NewLine)
End If
sb.Append(System.String.Format("{0:X2} ", bytes(i)))
Next
Return sb.ToString().Trim()
End Function
I made these basic changes to get it to work:
create a Decryptor
properly manage buffers and streams (see the Using clauses I added)
I also re-organized a little, and modified your code slightly to use a constant IV (all zeros) and use a constant key. This is so that you can get repeatable results from one run to the next. In a real app you would use a randomized IV and use a password-derived key. (See Rfc2898DeriveBytes)
ok, that allows the code to compile. I think you want to see the effect of chaining. That is not so easy, but maybe something like this will show you what you want to see:
For i As Integer = 1 To 2
Using ms = New MemoryStream
Using cstream = New CryptoStream(ms, encryptor, CryptoStreamMode.Write)
For j As Integer = 1 To i
cstream.Write(plaintext, 0, plaintext.Length)
Next j
End Using
out = ms.ToArray
Console.WriteLine("Encrypted (cycle {0}):", i)
Console.WriteLine("{0}", ArrayToString(out))
System.Console.WriteLine()
End Using
Next i