Problema con decriptazione dati

di il
1 risposte

Problema con decriptazione dati

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

1 Risposte

Devi accedere o registrarti per scrivere nel forum
1 risposte