Visual Basic em Português

Página pessoal de Jorge Paulino sobre o Visual Basic (VB.NET, ASP.NET, VB6, VBA) e algumas noticias de tecnologia

VB.NET: Criptografia - TripleDES

A segurança de dados é algo fundamental em qualquer aplicação e cada vez mais é um motivo de preocupação. Quando se guarda determinado tipo de informação, numa base de dados por exemplo, é importante que a mesma esteja segura, principalmente em alguns campos como é o caso de passwords, números de cartões de crédito, informações confidenciais, etc.

É aí que a criptografia entra, através da encriptação ou codificação de dados. A encriptação é a transformação de informação electrónica de texto legível em texto incompreensível, através de um cifra, também conhecido por algoritmo.

Este processo é bastante complexo mas a .Net Framework através da Namespace System.Security.Cryptography simplifica bastante, tornando-o acessível e fácil de utilizar. Existem diversas classes disponíveis que implementam diferentes tipos de encriptação, como é o caso de: AES (Advanced Encryption Standard), DES (Data Encryption Standard), RC2 (Rivest Cipher), Rijndael, TripleDES (Triple Data Encryption Standard), entre outras.

 

De entre todos os métodos de encriptação disponíveis, alguns são mais seguros do que outros, como é o caso do Rijndael ou do AES. No entanto e para este exemplo, será mostrado a utilização do TripleDES, por ser bastante simples de implementar.

Como curiosidade o TripleDES baseia-se no algoritmo DES que foi utilizado pelo governo norte-americano e que, actualmente, pode ser decifrado. Posteriormente foi desenvolvida uma versão melhorada onde o algoritmo corre três vezes com duas chaves simétricas: o TripleDES.


Para a implementação de uma encriptação utilizando o algoritmo TripleDES devemos criar a seguinte classe:


Imports
System.Text
Imports System.Security.Cryptography

''' <summary>
''' Encriptação simples usando TripleDES
''' (Triple Data Encryption Standard)
''' </summary>
Public Class Crypto

    Private Shared TripleDES As New TripleDESCryptoServiceProvider
    Private Shared MD5 As New MD5CryptoServiceProvider

    ' Definição da chave de encriptação/desencriptação
    Private Const key As String = "CHAVE12345teste"

    ''' <summary>
    ''' Calcula o MD5 Hash 
    ''' </summary>
    ''' <param name="value">Chave</param>
    Public Shared Function MD5Hash(ByVal value As String) As Byte()

        ' Converte a chave para um array de bytes 
        Dim byteArray() As Byte = ASCIIEncoding.ASCII.GetBytes(value)
        Return MD5.ComputeHash(byteArray)

    End Function   

    ''' <summary>
    ''' Encripta uma string com base em uma chave
    ''' </summary>
    ''' <param name="stringToEncrypt">String a encriptar</param>
    Public Shared Function Encrypt(ByVal stringToEncrypt As String) As String   

        Try

            ' Definição da chave e da cifra (que neste caso é Electronic
            ' Codebook, ou seja, encriptação individual para cada bloco)
            TripleDES.Key = Crypto.MD5Hash(key)
            TripleDES.Mode = CipherMode.ECB   

            ' Converte a string para bytes e encripta
            Dim Buffer As Byte() = ASCIIEncoding.ASCII.GetBytes(stringToEncrypt)
            Return Convert.ToBase64String(TripleDES.CreateEncryptor().TransformFinalBlock(Buffer, 0, Buffer.Length))   

        Catch ex As Exception
            MessageBox.Show(ex.Message, My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Error)

            Return String.Empty

        End Try   

    End Function

  

    ''' <summary>
    ''' Desencripta uma string com base em uma chave
    ''' </summary>
    ''' <param name="encryptedString">String a decriptar</param>
    Public Shared Function Decrypt(ByVal encryptedString As String) As String   

        Try

            ' Definição da chave e da cifra
            TripleDES.Key = Crypto.MD5Hash(key)
            TripleDES.Mode = CipherMode.ECB   

            ' Converte a string encriptada para bytes e decripta
            Dim Buffer As Byte() = Convert.FromBase64String(encryptedString)
            Return ASCIIEncoding.ASCII.GetString(TripleDES.CreateDecryptor().TransformFinalBlock(Buffer, 0, Buffer.Length))

        Catch ex As Exception
            MessageBox.Show(ex.Message, My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Error)

            Return String.Empty

        End Try   

    End Function

End Class

   

Depois, para a implementar na aplicação, é só necessário 
   

        Dim source As String = "vbtuga"

        ' Mostra o texto original
        Debug.WriteLine("Texto original  : " & source)

        ' Encripta a string
        Dim result As String = Crypto.Encrypt(source)

        ' Mostra o resultado da encriptação
        Debug.WriteLine("Texto encriptado: " & result)

        ' Decripta e mostra o texto original
        Debug.WriteLine("Texto decriptado: " & Crypto.Decrypt(result))   

   

Neste pequeno teste, o resultado é o seguinte (na Immediate Window):

Texto original     : vbtuga

Texto encriptado: 6ldtC7GfpGg=

Texto decriptado: vbtuga


Este artigo é um exemplo de encriptação de forma a tornar os dados e as aplicações mais seguras. Brevemente, assim que possível, irei mostra mais dois exemplos de encryptação em AES e
Rijndael.

Exemplo do artigo: DOWNLOAD DO FICHEIRO
   

PS: Como sempre, qualquer dúvida, comentário ou correcção ao artigo é sempre bem vinda!

15 comentários:

Anónimo disse...

Caro amigo,
Sou novo em Visual Basic e tenho dificuldade em criar uma conexão com o Banco SQLServer, pois os tutoriais que vi, me pegam em outra duvida. Onde implementar o que é colocado nos tutoriais. Tenho visto os seus artigos e tenho gostado muito, mas não tenho conseguido implementa-los. Será que vc teria um tutorial mais passo a passo. ME desculpe minha ignorancia. Obrigado!
Alex
Quanquer coisa meu email é alexsander.marinho@hotmail.com

Anónimo disse...

boa-noite,

Estou a realizar programas de Visual Basic no Visual Studio 2005 e tenho deparado com um conjunto de métodos que não se encontram, simultaneament, nos dosi VB's.
Exemplo: no pictureBox, os métodos cls e print não os identifico no Visual studio (e usei-os muito no VBasic); o método Value das caixas de verificação não sei qual é; O Date e o Time foram substituidos,...

Há algum local (ligação, site, trabalho, painel,...) onde possa verificar a correspondência e diferenças de nomeação, nomenclatura, etc., entre o Visual Basic6 e o Visual Studio5?

Agradeço,
João Moreira

Jorge Paulino disse...

Alex,

Veja o seu email.

João Moreira,

Sinceramente não sei se existe algo a comparar o que existia e o que existe agora, mas como existem muito mais coisas agora ... não é fácil!

Existe no entanto alguma documentação (em inglês) que mostra como fazer o upgrade entre versões. Eu publiquei essa informação num fórum (http://www.portugal-a-programar.org/forum/index.php/topic,29741.0.html) e são pdf's gratuitos.

Qualquer dúvida em relação a métodos que existiam e a sua correspondência actualmente posso tentar dar uma ajuda.

Anónimo disse...

o.k.
Vou passar por lá.
Obrigado,
João Moreira

Anónimo disse...

Muito obrigado por este tuturial

Andava aprocura disto e fiquei a entender o que queria

Obrigado pelo trabalho.

Anónimo disse...

Exelente!

Agora entendo como isto funciona :)

Muito Obrigado!

Anónimo disse...

Boa tarde.

Em relação a isto da criptografia:

Eu em vb insiro uma password e ela fica emcriptada tudo bem.

Mas eu em PHP uso a propriedade md5 para fazer tambem a codificação mas as codificações ficam diferentes da mesma palavra.

A minha ideia era gravar no vb e conseguir descriptar em php e vice versa.

Se alguém me pudesse ajudar agradecia.

Jorge Paulino disse...

Olá pmaster,

Obrigado pela visita ao meu blog.

Este problema está a ser seguido no seguinte endereço: http://www.portugal-a-programar.org/forum/index.php/topic,31357.0.html

Anónimo disse...

Olá JPaulino tudo bem contigo ?
Espero que sim.
Estive a ver quase todos os exemplos que tens no teu Blog, e como não podia deixar de ser ( como já sabes..) interessei-me particularmente por este.
No fim de fazer o download exemplo que colocas-te aqui , testei-o em VB.net 2008 ; até á encriptação de dados normais , tudo bem , funciona na perfeição ; quando chegamos á encriptação de caracteres como : [ éè ü ã ª etc..] é que a coisa se complica !! não só me dá a chave errada , como tambem não reconhece os caracteres pelo MD5.

Comp.
programadorvb6

Anónimo disse...

Caso Tenhas alguma solução gostaria que a publica-a aqui neste espaço.
Até+
E obrigado pelo outros esclarecimentos.

Programadorvb6

Jair Júnior disse...

Olá Morpheus, eu consegui solucionar isso dos caracteres especiais apenas trocando no lugar onde tem "ASCIIEncoding.ASCII" vc coloca "ASCIIEncoding.UTF32". Aí resolve seu problema!!
Vc pode colocar UTF8, UTF16 ou UTF32, de acordo a sua necessidade!!

Anónimo disse...

Muito legal, mesmo depois de tanto tempo me ajudou!

Valew meu Caro!

Ailton Junior disse...
Este comentário foi removido por um gestor do blogue.
iPad Application Development disse...

Hey its really wonderful blog and I got some very useful informative over here which i wanted to know so thanks for this article.

Rafael Santoro (rafaelsantoro@outlook.com) disse...

Código muito bom, porém fiz uma melhoria significativa nele.
Exemplo: Se encriptar a palavra "água" o resultado descriptografado fica "?gua".
Resolvi isso facilmente utilizando o UTF8Encoding nas três seguintes linhas pelo código:

' Converte a chave para um array de bytes
Dim byteArray() As Byte = UTF8Encoding.UTF8.GetBytes(value)

' Converte a string para bytes e encripta
Dim Buffer As Byte() = UTF8Encoding.UTF8.GetBytes(stringToEncrypt)

Return UTF8Encoding.UTF8.GetString(TripleDES.CreateDecryptor().TransformFinalBlock(Buffer, 0, Buffer.Length))

Dessa forma, mesmo que a string à ser criptografada tenha caracteres com acentos, ela será corretamente descriptografada.

Desde já, muito grato.
Esse post foi muito útil para mim.



Microsoft Office Especialist

Membro da Comunidade
Experts-Exchange


Administ. da Comunidade
Portugal-a-Programar



Twitter

Artigos no CodeProject

Artigos no CodeProject
Google-Translate-ChineseGoogle-Translate-Portuguese to FrenchGoogle-Translate-Portuguese to GermanGoogle-Translate-Portuguese to ItalianGoogle-Translate-Portuguese to JapaneseGoogle-Translate-Portuguese to EnglishGoogle-Translate-Portuguese to RussianGoogle-Translate-Portuguese to Spanish

Subscrever Novidades

Endereço de Email:

Delivered by FeedBurner

Seguidores

Histórico