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:
DESCryptoServiceProvider ( algoritimo DES )
RC2CryptoServiceProvider ( algoritimo RC2 )
RijndaelManaged (algoritimo
Rijndael )
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 '_#' .
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:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
news://sci.crypt - Discussão sobre criptologia e tópicos relacionados
Stalling, William, NetWork Security Essentials, Prentice Hall, 2000