Sto cercando di implementare la codifica e decodifica di un testo.
Sono agli albori.
Ho una textbox di imput per il testo da codificare che inserisco in una listbox in modo criptato come da codice.
Premendo il butto3 intendo che il codice criptato ritorni il tsto originale.
Come si vede invio la password ma sembra che sbaglio nella parte di trasfotmazione del testo criptato in byte. cmq mi restituisce eccezione password errata. Ma la password è 1 ed è giusta.
chi mi può aiutare. Grazie
Imports System.Text.UTF8Encoding
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
End Sub
' criptazione
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
ListBox1.Items.Clear()
Dim p
p = TextBox1.Text
Call Module1.Main(p)
ListBox1.Items.Add(Risultato1)
End Sub
' decriptazione
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
Dim Input As Byte() = UTF8.GetBytes(ListBox1.ToString)
Dim key As String = "1"
' gli passo la password e il testo in byte
Call Module1.RijndaelDecrypt(key, Input)
End Sub
End Class
queto è il codice del modulo1
Imports System.Security.Cryptography
Imports System.Text.UTF8Encoding
Imports System.Text
Module Module1
Public Testo As String
Public Pass As String = "1"
Public Risultato1 As String
'Vettore di bytes casuali usati per oscurare la chiave:
'verrà usato nella funzione di derivazione della password
Private SaltBytes As Byte() = New Byte() _
{162, 21, 92, 34, 27, 239, 64, 30, 136, 102, 223}
'Questo è un vettore di inizializzazione per algoritmi
'simmetrici a 256-bit. Si nota, infatti, che è lungo 32 bytes
Private IV32 As Byte() = New Byte() _
{133, 206, 56, 64, 110, 158, 132, 22,
99, 190, 35, 129, 101, 49, 204, 248,
251, 243, 13, 194, 160, 195, 89, 152,
149, 227, 245, 5, 218, 86, 161, 124}
Public Sub Main(Testo)
Dim Input, Output As String
Dim Key As String
Console.WriteLine("Inserire un testo qualsiasi:")
Input = Testo
Console.WriteLine("Inserire una chiave di criptazione:")
Key = Pass
Try
Output = ToHex(RijndaelEncrypt(Key, Input))
Console.WriteLine()
Console.WriteLine("Il testo criptato è:")
Risultato1 = Output
Console.WriteLine(Output)
Catch CE As CryptographicException
Console.WriteLine("Password errata!")
End Try
'sultato As String = Output
'Console.ReadKey()
End Sub
'La derivazione di password è un'altra delle tecniche
'usate in criptazione: si cifra la chiave iniziale con un
'algoritmo di derivazione, fornendo come base un vettore
'di bytes casuali, chiamato <strong>salt crittografico</strong>.
'L'algoritmo applica una trasformazione sulla chiave un
'numero dato di volte (iterazioni) e restituisce alla fine una
'password di lunghezza specificata. In questo caso, poiché
'si sta utilizzando l'algoritmo Rijndael a 256 bit, sarà
'di 32 bytes
Private Function DerivePassword(ByVal Key As String) As Byte()
'Il provider crittografico
Dim Derive As Rfc2898DeriveBytes
'Il risultato dell'operazione
Dim DerivedBytes() As Byte
'Crea un nuovo provider crittografico per l'algoritmo
'di derivazione RFC2898, che ha come input Key, come
'salt crittografico l'array SaltBytes sopra definito
'e come numero di iterazioni 5. Il secondo e il terzo
'parametro sono del tutto casuali: li si può
'modificare arbitrariamente
Derive = New Rfc2898DeriveBytes(Key, SaltBytes, 5)
'Applica la trasformazione e deriva una nuova password
'ottenuta come array di 32 bytes
DerivedBytes = Derive.GetBytes(32)
Return DerivedBytes
End Function
'Data una chiave Key e un messaggio Text, usa l'algoritmo simmetrico
'a blocchi Rijndael (AES) per ottenere un insieme di dati criptato
Public Function RijndaelEncrypt(ByVal Key As String, ByVal Text As String) As Byte()
'Crea il nuovo provider crittografico per questo algoritmo
Dim Provider As New RijndaelManaged
'La password derivata
Dim BytePassword As Byte()
'L'oggetto che ha il compito di processare le informazioni
Dim Encryptor As ICryptoTransform
'L'output della funzione
Dim Output As Byte()
'L'input della funzione, ossia il testo convertito
'in forma binaria. Il formato UTF8 permette di
'mantenere anche i caratteri speciali come quelli accentati
Dim Input As Byte() = UTF8.GetBytes(Text)
'Imposta la dimensione della chiave
Provider.KeySize = 256
'Imposta la dimensione del blocco
Provider.BlockSize = 256
'Ottiene la password tramite derivazione dalla chiave
BytePassword = DerivePassword(Key)
'Crea un nuovo oggetto codificatore
Encryptor = Provider.CreateEncryptor(BytePassword, IV32)
'Cripta il testo
Output = Encryptor.TransformFinalBlock(Input, 0, Input.Length)
'Elimina le informazioni fornite al provider
Provider.Clear()
'Distrugge l'oggetto codificatore
Encryptor.Dispose()
Return Output
End Function
'Data una chiave Key e un messaggio cifrato Data, usa l'algoritmo
'simmetrico a blocchi Rijndael (AES) per ottenere l'insieme di
'dati di partenza
Public Function RijndaelDecrypt(ByVal Key As String, ByVal Data() As Byte) As String
'Crea un nuovo provider crittografico
Dim Provider As New RijndaelManaged
'La password derivata
Dim BytePassword As Byte()
'L'oggetto che ha il compito di processare le informazioni
Dim Decryptor As ICryptoTransform
'L'output della funzione in bytes
Dim Output As Byte()
Provider.KeySize = 256
Provider.BlockSize = 256
BytePassword = DerivePassword(Key)
'Ottiene l'oggetto decodificatore
Decryptor = Provider.CreateDecryptor(BytePassword, IV32)
'Tenta di decriptare il messaggio: se la chiave è
'sbagliata, lancia un'eccezione
Try
Output = Decryptor.TransformFinalBlock(Data, 0, Data.Length)
Catch Ex As Exception
Throw New CryptographicException("Criptazione fallita!") ' QUI HO L' ERRORE
Finally
Provider.Clear()
Decryptor.Dispose()
End Try
Return UTF8.GetString(Output)
End Function
'I dati prodotti in output sono allocati in vettori di bytes,
'ma le stringhe non sono il supporto più adatto per
'visualizzarli, poiché vengono compresi anche
'caratteri di controllo o null terminator. In ogni caso,
'la stringa sarebbe o compromessa o illeggibile (non che
'non lo debba essere). Questa funzione restituisce tutto
'il vettore come rappresentazione esadecimale in stringa
'rendendo più gradevole la vista del nostro
'magnifico messaggio cifrato
Public Function ToHex(ByVal Bytes() As Byte) As String
Dim Result As New StringBuilder
For I As Int32 = 0 To Bytes.Length - 1
'Accoda alla stringa il codice in formato esadecimale,
'facendo in modo che occupi sempre due posti, eventualmente
'pareggiando con uno zero sulla sinistra
Result.AppendFormat("{0:X2}", Bytes(I))
Next
Return Result.ToString
End Function
End Module