VB.NET- Criptografando arquivos

Neste artigo vou mostrar como você pode usar na prática as classes que o .NET Framework oferece para realizar a criptografia de arquivos.

Para saber mais sobre o assunto leia também os artigos :

Vou começar com um exemplo de criptografia de chave privada ou criptografia simétrica que indica que a mesma chave usada para cifrar é usada para decifrar o arquivo.

Para começar vamos precisar de uma chave e de um vetor de inicialização para cifrar e decifrar os dados.

Mas para que eu preciso do vetor de inicialização ?

O vetor de inicialização é necessário para evitar que o mesmo bloco de texto seja cifrado de maneira idêntica se submetido mais de uma vez a mesma chave. Desta forma fica muito mais difícil obter a chave pela análise do texto cifrado.

Você deve atentar que a desvantagem deste método é que ele assume que as partes envolvidas na comunicação dos dados devem estar de acordo e ter conhecimento do valor da chave do vetor de inicialização. 

O.NET Framework fornece as seguintes classes que podem ser usadas para implementar um algoritmo de cifragem usando chave privada:

  1. DESCryptoServiceProvider ( algoritimo DES )

  2. RC2CryptoServiceProvider ( algoritimo RC2 )

  3. RijndaelManaged (algoritimo Rijndael )

  4. TrippleDESCryptoServiceProvider (algoritimo TrippleDES)

Para poder usar as classes de criptografia você vai ter que usar os seguintes imports no seu projeto:

Imports System.IO
Imports System.Text
Imports System.Security.Cryptography

Vamos criar um pequeno exemplo que irá cifrar e decifrar arquivos.
Inicie um novo projeto no VS.NET e escolha um projeto do tipo Windows Application usando VB.NET.
No formulário padrão inclua os seguintes componentes:
1- Um groupBox
2- Três Labels
3- Dois TextBox
4- Dois Botões de Comando
5- Um componente OpenFileDialog
Conforme a figura abaixo:
O usuário vai informar o nome caminho do arquivo e a senha com 8 caracteres e a seguir clicar no botão para iniciar o processo de cifragem do arquivo.

O arquivo cifrado será criado no mesmo local do arquivo original com o mesmo nome acrescido do caractere '_#' .
Ex:   macoratti.txt  =>  macoratti_#.txt

Para reverter o processo e decifrar o arquivo basta informar o nome do arquivo cifrado (macoratti_#.txt) que será criado um arquivo igual ao arquivo original com o nome original (macoratti.txt)

A primeira coisa a fazer e definir as variáveis para criar a chave privada e o vetor de inicialização:
   'cria um array de 8-byte para a chave privada
    Public aChave(7) As Byte

    'preenche o vetor de inicialização com alguns valores aleatórios
    Private Vector() As Byte = {&H12, &H44, &H16, &HEE, &H88, &H15, &HDD, &H41}
A rotina que cria a chave é dada a seguir:
   'cria a chave e o hash da senha
    Sub criaChave(ByVal strKey As String)

        ' array de Byte para tratar a senha
        Dim arrByte(7) As Byte

        Dim AscEncod As New ASCIIEncoding
        Dim i As Integer = 0
        AscEncod.GetBytes(strKey, i, strKey.Length, arrByte, i)

        'obtem o valor do hash da senha
        Dim hashSha As New SHA1CryptoServiceProvider
        Dim arrHash() As Byte = hashSha.ComputeHash(arrByte)

        'põe o valor do hash na chave
        For i = 0 To 7
            aChave(i) = arrHash(i)
        Next i
    End Sub

 

Observe que estamos usando a classe SHA1CryptoServiceProvider para criar um hash da senha

 

A classe SHA1CryptoServiceProvider computa o hash SHA1 para um dado de entrada usando a implementação fornecida pelo serviço de criptografico (CSP)

 

 

Estou criando uma chave de 8 bytes mas você pode criar uma chave de 16 ou 32 ou ainda 64. Mas vai ter que fazer os ajustes no código.

Após o usuário informa o arquivo e a senha a chave será criada e , conforme a extensão do arquivo , a rotina de cifrar ou decifrar será chamada. Abaixo temos a rotina para cifrar um arquivo.

 Sub Cifrar(ByVal entrada As String, ByVal saida As String)
        Try
            Dim storage(4096) As Byte             'cria um buffer
            Dim totalBytesEscritos As Long = 8  'bytes escritos

            Dim tamanhoPacote As Integer         'determina o numero de bytes escritos de uma vez

            'Declara os arquivos  streams. 
            Dim arqEntrada As New FileStream(entrada, FileMode.Open, FileAccess.Read)
            Dim arqSaida As New FileStream(saida, FileMode.OpenOrCreate, FileAccess.Write)
            arqSaida.SetLength(0)

            Dim comprimentoTotalArquivo As Long = arqEntrada.Length       'Define o tamanho do arquivo fonte

            'cria um objeto cripto
            Dim des As New DESCryptoServiceProvider
            Dim crStream As New CryptoStream(arqSaida, des.CreateEncryptor(aChave, Vector), CryptoStreamMode.Write)

            'fluxo de stream
            While totalBytesEscritos < comprimentoTotalArquivo
                tamanhoPacote = arqEntrada.Read(storage, 0, 4096)
                crStream.Write(storage, 0, tamanhoPacote)
                totalBytesEscritos = Convert.ToInt32(totalBytesEscritos + tamanhoPacote / des.BlockSize * des.BlockSize)
            End While

            crStream.Close()

        Catch e As Exception
            MsgBox(e.Message)
        End Try
    End Sub

A classe DESCryptoServiceProvider define um objeto que empacota o acesso ao provedor do  serviço de criptografia (CSP) versão do algoritmo DES.(Data Encryption Standard)

O código do botão para procurar arquivos que usa o componente OpenFileDialog é o seguinte :

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        OpenFileDialog1.Title = "Selecione o arquivo para Cifrar/Decifrar"
        OpenFileDialog1.Filter = "Todos os arquivos (*.*)|*.*"
        lblmsg.text = ""

        If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
            TextBox1.Text = OpenFileDialog1.FileName
            Button2.Enabled = True
        End If

End Sub

O código para decifrar é quase idêntico ao código para cifrar.

Executando o projeto e fazendo o teste para um arquivo texto que eu criei chamado teste.txt, temos:

Abaixo o resultado exibindo o conteúdo do arquivo em claro e do arquivo após cifragem:

Arquivo teste.txt antes da cifragem Arquivo teste_#.txt cifrado.

Neste artigo você aprendeu como usar as classes para gerar Hash e para criptografar e decriptografar arquivos.

È apenas o começo temos muito que falar sobre criptografia no VB.NET , e com certeza o farei.

Pegue o projeto completo aqui :   criptoNet.zip

Até mais...

referências:

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

 

             Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter
 

Referências:


José Carlos Macoratti