Skip Navigation Links



Translate this page now :



»Programação
»Programação.NET
»Banco de Dados
»Webdesign
»Office
» Certificações Microsoft 4
»Treinamentos4
»Programação 4
»Webdesign«
»Office & User Tips«
»Grupos de UsuĆ”rios
»CĆ©lulas AcadĆŖmicas«

O melhor teclado da microsoft
Você já está cadastrado e participa do grupo de usuários de sua cidade ? Se não, comente o porque.
 
 
FaƧa um pequeno teste com 10 questƵes de VB
.:.
Teste seus conhecimentos em Visual Basic, SQL Server e ASP 3.0 com nossas provas on-line
.:.
Aprimore seus conhecimentos em programaĆ§Ć£o com nosso treinamento on-line de lĆ³gica de programaĆ§Ć£o
.:.
Veja nosso calendƔrio de treinamentos
Gostou da PƔgina?
Então

para um amigo!

Pesquisa personalizada
Pesquisar Dicas:

 







Criptografia simétrica de dados

Iniciamos há algumas semanas nossa série sobre criptografia de dados. Na coluna em http://www.bufaloinfo.com.br/artigos/coluna08.asp explicamos detalhes sobre as metodologias de criptografia de dados e no artigo em http://www.bufaloinfo.com.br/artigos/artigo2405.asp explicamos o funcionamento da metodologia de hash.

Neste artigo vamos ver detalhes sobre mais uma das metodologias de criptografia, a criptografia simétrica.

A criptografia simétrica consiste em, basicamente, criptografar informações com uma senha (chave) e um algorítimo. Para descriptografar aquele que recebe a informação deverá utilizar a mesma chave e o mesmo algorítimo.

Portanto a criptografia simétrica depende do transmissor e receptor já terem entrado em acordo com relação a chave a ser utilizada, utilizando algum meio seguro para trocarem a chave entre si.

O processo de realização da criptografia é feito dividindo-se a mensagem em pequenos blocos e aplicando a senha e o algorítimo a cada bloco da mensagem. Claro que alguns métodos existentes nas classes que implementam a criptografia fazem esse trabalho para nós, simplificando o processo.

Mas para garantir a segurança da criptografia simétrica é necessário mais do que a chave. Imagine que tenhamos a palavra "computador" dentro de um texto, se repetindo inúmeras vezes. Aplicando sempre o mesmo algorítimo e a mesma chave a palavra "computador" sempre aparecerá criptografada da mesma forma. Isso permite que alguém, tentando decifrar a mensagem, comece a fazer análise da estrutura das palavras contidas na mensagem e, se descobrir que determinada palavra significa "computador", descobrirá a senha e decifrará a mensagem.

Para evitar isso, além de aplicar a senha e o algorítimo a cada bloco da mensagem que estará sendo criptografado, aplica-se também um valor resultante de um cálculo com o bloco de dados anterior. Com isso a palavra "computador" aparecerá de forma diferente a cada ocorrência dentro da mensagem, impossibilitando que se consiga descobrir a senha.

O primeiro bloco de dados, porém, ficaria sem a aplicação de um valor de bloco anterior (pois não existe). Para resolver este problema os algorítimos simétricos utilizam um initialization vector - IV - vetor de inicialização, que determina um conjunto de bytes inicial que o algorítimo aplicará ao primeiro bloco que estará sendo criptografado e, a partir dai, esse vetor mudará a cada bloco calculado.

As classes que implementam os algorítimos de criptografia são capazes de fazer a geração automática tanto da chave para criptografia como do Initialization Vector. Ambos, porém, precisam ser passados para o receptor para que o receptor possa descriptografar as mensagens recebidas. Então o transmissor precisa gerar a chave e o vetor de inicialização e passa-los de forma segura para o receptor. Podemos criar uma pequena aplicação que faça a geração de chaves para fazer parte deste trabalho.

Antes de começar, vamos dar uma olhada nas classes do .NET que implementam criptografia sincrona :

 

Algorítimos
Classe
DES System.Security.Cryptography.DESCryptoServiceProvider
RC2 System.Security.Cryptography.RC2CryptoServiceProvider
Triple-DES System.Security.Cryptography.TripleDESCryptoServiceProvider
Rijndael System.Security.Cryptography.RijndaelManaged

 

Vamos então criar um formulário Windows com 2 caixas de texto e um botão. Vamos fazer com que o botão, ao ser clicado, gere a chave de criptografia e o initialization vector.

Para exibir as chaves nas textbox, vamos fazer com que esta aplicação monte uma string com uma instrução dim, definindo uma variável para conter as chaves, algo +/- assim :

Dim chave as byte()= {1,2,3,4}
       

Então precisaremos de uma função que a partir do byte array da chave (sempre gerada no formato de byte array) gere a instrução dim correspondente.

 Private Function montarinstrucao(ByVal b As Byte()) As String
   Dim s As String
   Dim by As Byte
   s = "{"
   For Each by In b
   s &= by.ToString & ","
   Next
   s = Microsoft.VisualBasic.Left(s, Len(s) - 1)
   s &= "}"
   s = "Dim vetor as byte() = " & s
   Return (s)
 End Function
       

Como vemos acima, trata-se de um código simples para fazer a montagem da instrução dim a partir de um byte array. O passo seguinte é montarmos o código do botão para fazermos a geração das chaves :

 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim obj As New RC2CryptoServiceProvider
    Dim b As Byte()
 
    obj.GenerateIV()
    b = obj.IV
    TextBox2.Text = montarinstrucao(b)
    obj.GenerateKey()
    b = obj.Key
    TextBox1.Text = montarinstrucao(b)
 End Sub
       

O objeto responsável por realizar a criptografia possui os métodos generateIV e generateKey . Tendo executado esses métodos podemos recuperar os valores de Key e IV e utilizar nossa função para realizar a exibição destes valores.

Vamos então montar uma pequena aplicação para testar a criptografia e descriptografia. Vamos criar um formulário windows com 3 textbox e 2 botões.

A primeira textbox servirá para digitarmos a mensagem a ser criptografada. A 2a textbox exibirá o resultado da criptografia e a 3a textbox exibirá a mensagem novamente, depois de ser descriptografada. Já os dois botões servirão um para criptografar e outro para descriptografar a mensagem.

Vamos manter o objeto para realização da criptografia a nível de formulário e, no load, vamos configura-lo. Veja como fica :

   Dim obj As New RC2CryptoServiceProvider
   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
       Dim chave As Byte() = {242, 186, 54, 173, 133, 182, 147, 252, 77, 181, 139, 132, 80, 110, 159, 21}
       Dim vetor As Byte() = {137, 220, 146, 142, 243, 0, 169, 32}
       obj.IV = vetor
       obj.Key = chave
   End Sub
       

Observe que no load estamos utilizando duas definições de variáveis criadas pela primeira aplicação que fizemos neste artigo. atribuimos as chaves nas respectivas propriedades da classe para criptografia.

Veja como fica o botão para criptografar :

 

   Dim b As Byte()
   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim enc As ICryptoTransform
        enc = obj.CreateEncryptor()
        b = enc.TransformFinalBlock(ASCII.GetBytes(TextBox1.Text), 0, Len(TextBox1.Text))
        TextBox2.Text = ASCII.GetString(b)
   End Sub
       

A partir da classe que implementa o algorítimo de criptografia utilizamos o método createEncryptor, que gera um objeto que implementa a interface ICryptoTransform e, desta forma, realiza o processo de criptografia.

O botão para descriptografar é praticamente identico, veja :

 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
   Dim enc As ICryptoTransform
   enc = obj.CreateDecryptor()
   b = enc.TransformFinalBlock(b, 0, b.Length)
   TextBox3.Text = ASCII.GetString(b)
 End Sub

 

No artigo anterior, sobre utilização de algorítimos de Hash, utilizamos uma classe chamada clsHashHelper para auxiliar no processo de criptografia de uma mensagem em um webService e descriptografia no client.

Da mesma forma, podemos ter uma classe clCryptoHelper para nos auxiliar com a criptografia simétrica. A criptografia simétrica é mais simples do que o Hash, pois não precisa da comparação entre os hashs. Porém, da mesma forma que ocorre com o Hash, precisamos formatar a mensagem criptografada na forma de um conjunto de bytes para podermos realizar a transmissão via HTTP, caso contrário alguns caracteres seriam inválidos para o XML.

Vamos então fazer uma classe para realizar essa formatação, da mesma forma que fizemos na classe de Hash. Veja como fica :

Imports System.Security.Cryptography
   Imports System.Text.ASCIIEncoding
   Public Class clCryptoHelper
       Dim obj As New RC2CryptoServiceProvider
       dim vchave as byte()
       dim vIV as byte()
   
       Private Function InterpretarMensagem(ByVal mensagem As String) As mensagem
          Dim r As Byte()
          Dim ar As String() = mensagem.Split(" ")
          Dim a As Integer
          r = New Byte(ar.Length - 1) {}
          For a = 0 To r.Length - 1
             r(a) = Byte.Parse(ar(a), System.Globalization.NumberStyles.HexNumber)
          Next
          Return (r.tostring)
      End Function
      Private Function formatarMensagem(ByVal mensagem As Byte()) As String
         Dim r As String
         Dim a As Integer
         For a = 0 To hash.Length - 1
             r &= Hex(mensagem(a)) & " "
         Next
         Return (Trim(r))
      End Function
      Private Function Criptografar(ByVal mensagem As String) As String
         Dim enc As ICryptoTransform
         obj.key=vchave
         obj.iv=vIV
         enc = obj.CreateEncryptor()
         b = enc.TransformFinalBlock(ASCII.GetBytes(mensagem), 0, Len(mensagem))
         return(formatarmensagem(b))
     End Function
       
      Private Function DesCriptografar(ByVal mensagem As String) As String
         Dim enc As ICryptoTransform
         enc = obj.CreateDecryptor()
         obj.key=vchave
         obj.iv=vIV
         b = enc.TransformFinalBlock(interpretarmensagem(mensagem), 0, len(mensagem))
         return(ASCII.GetString(b))
      End Function
       
      Public Property chave() As Byte()
         Get
            Return (vchave)
         End Get
         Set(ByVal Value As Byte())
            vchave = Value
         End Set
     End Property
     Public Property IV() As Byte()
        Get
          Return (vIV)
        End Get
        Set(ByVal Value As Byte())
          vIV = Value
        End Set
   End Property
 End Class
       

Podemos observar que temos nesta classe 2 métodos principais, criptografar e descriptografar. Esses métodos fazem uso das funções internas de formatação, encapsulando esta necessidade e desta forma simplificando o processo de criptografia. Com isso fica bem mais simples gerar um webService com transmissão criptografada.

Da mesma forma como no artigo anterior, para montar o webService precisaremos de uma classe personalizada para a devolução dos dados, mas a classe será um pouco diferente desta vez. Veja o exemplo :

 <WebMethod()> _
   Public Function RetornaClientes() As Retorno
      Dim obj As New Retorno
      dim cripto as new clCryptoHelper
      cripto.key = {242, 186, 54, 173, 133, 182, 147, 252, 77, 181, 139, 132, 80, 110, 159, 21}
      Cripto.IV = {137, 220, 146, 142, 243, 0, 169, 32}
      DA.Fill(Ds1)
           
      obj.dados = cripto.Criptografar(Ds1.GetXml)
      Return (obj)
   End Function

 <Serializable()> _
   Public Class Retorno
      Public dados As string
   End Class

 

O client precisará utilizar a mesma classe para descriptografar as informações. Veja como fica :

 

 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
   Handles Button1.Click
   Dim obj As New srvDados.Service1
   Dim ret As srvDados.Retorno
   dim dados as dataset
   dim cripto as new clCryptoHelper
   cripto.key = {242, 186, 54, 173, 133, 182, 147, 252, 77, 181, 139, 132, 80, 110, 159, 21}
   Cripto.IV = {137, 220, 146, 142, 243, 0, 169, 32}
       
   ret = obj.RetornaClientes
   dados.readxml(cripto.descriptografar(ret.dados))
 
   DG.DataSource = dados.tables(0)
 End Sub
       


DENNES TORRES
MCAD,MCSD,MCSE,MCDBA




Envie seus comentįrios sobre este artigo

Nome :

E-mail :

Comentários :


Avise-me quando houverem novos comentįrios nesta pįgina

Veja abaixo os comentários já enviados :

Nome : Dennes Torres E-Mail : dennes@bufaloinfo.com.br

Existem alguns erros na publicação do código da cryptoHelper :

Na função formatarMensagem onde está hash.length deve ser trocado para mensagem.length

O retorno da interpretarMensagem deve ser as byte()

Na instrução return da interpretarMensagem deve ser retirado o .tostring

Nome : Renato E-Mail : contatos_net@yahoo.com.br
Dennes,

Algumas function da classe estão dando erro, impossibilitando o entendimento e a conclusão do exemplo.

Como faço para resolver?

Renato Vilela
Nome : Renato E-Mail : contatos_net@yahoo.com.br
Dennes,

Algumas function da classe estão dando erro, impossibilitando o entendimento e a conclusão do exemplo.

Como faço para resolver?

Renato Vilela
Nome : Avelino Ferreira Gomes Filho E-Mail : avelino@furnas.com.br
Substitui as seguintes linhas e o código está funcionando.
Em DesCriptografar

b = enc.TransformFinalBlock(interpretarmensagem(mensagem), 0, len(mensagem))

POR

Dim b As Byte()
b = Me.InterpretarMensagem(mensagem)
b = enc.TransformFinalBlock(b, 0, b.Length)
Nome : M4nt1s E-Mail : beatris_vcs@hotmail.com
com esse metodo é possivel descriptografar, um codigo fonte
do hotmail?

obrigado
Nome : Paulo E-Mail : titepaulo@ajato.com.br
Bom dia Srs:Minha filha tem um problema em sua maquina,pois mesmo sendo Dra,de computação é completamente ANALFA.Sendo assim como tenta aprender na marra,nas horas vagas(poucas) fica tentanto obter mais conhecimentos de informatica ,massem orientação é pular no escuro.Num desses pulos Ela clicou em criptografar e ai o desastre aconteceu.Todos os arquivos e pastas foram criptografadas e não sabemos como restaurar estes documentos.Neles tem estudos e cursos de medicina e gostaria de saber se vocês ai tem a solução.Se for possivel responda-me dando instruções de como pode ser feito isto,para podermos ajuda-la a recuperar seus dados. No aguardo de suas orientações antecipadamente agradeço.Paulo Gomes
Nome : josiel E-Mail : henrique@bio_fiocruz.com.br
maneiro
Nome : danilo borges E-Mail : danilo00729@hotmail.com
quero um programa par descriptografar
Nome : Edemilson E-Mail : ederon_8@hotmail.com
Desculpe-me, no entendo muito deste assusto: Informática (mas ainda tenho muitos mistérios a desvendar nesta área, pois sou um simples usuário). Gostaria de saber se poderiam ajudar-me a resolver um problema eu meu pc, que relato a seguir:
Tenho 2 HDs em em minha máquina, sempre faço login pelo drive C e os armazeno no dirve D. Outro dias criptografei alguns destes arquivos, só q logo após tive problemans no meu drive C. Ñ vi outra alternativa a ñ ser formatá-lo, só q c/ isto eu ñ consigo de jeito nenhum descriptografar os referidos arquivos no drive D. Existe alguma solução pra isto? Será q por favor porderiam ajudar-me?
Desde já agradeço

Edemilson
Nome : caio cesar de medieros E-Mail : sky_bolty8@hotmailcom
caras por favor me ajudem a recuperar meu msn sky_bolty7@hotmail.com pesso pelo amor de deus me ajudem oi cara me robo se vc forem os caras mente brilhantes vejam se conseguem enviar a senha pra esse email: sky_bolty8@hotmail.com estou contando com vcs pra min ajudarem plzplzplzpl!Obridado pela atenção ass: caio_xin
Nome : Junior E-Mail : langdonjunior@hotmail.com
Preciso descriptografar, arquivos criptografados por outro windows, pois tive que formatar e instalar tudo outra vez, me ajudem, criptografado pelo windows xp.
Nome : Dennes E-Mail : dennes@bufaloinfo.com.br
Oi !

Não dá, você deveria manter backup da chave de criptografia

[]'s
Nome : Fernando E-Mail : hsilva2006@hotmail.com
Este Post nada funciona, mesmo alterando de acordo que o Avelino pois não funciona...
Pq não corrigem ou tira, ja que não funciona....
Nome : Lenilson Marcenal E-Mail : lenilson.marcenal@gmail.com
Fiz todas as alterações postadas no início e troquei
Private Function Criptografar por
Public Function Criptografar

e

Private Function desCriptografar por
Public Function desCriptografar

Para que pudesse fazer uma classe separada e funcionou corretamente

Nome : Cezar Thyago E-Mail : cezar_thyago2@hotmail.com
Gostaria de saber se alguem poderia me ajudar por gentileza, Tenho um HD com duas partiçoes, uma coloco o sistema operacional e o outro coloco meus arquivos, algumas pastas e arquivos meus estavam criptografados, acidentamente tive q formatar meu HD e não consigo acessar esses arquivos criptografados, as pasta em que estão os arquivos eu consigo descriptografa-las mais os arquivos contidos nela estão no mesmo tamanho, mais não consigo abri-los.
Aguem poderia me ajudar com esse problema

Agradeço desde de já

ABraços
Nome : silmara E-Mail : silmaragomes_stos@hotmail.com
Oi Boa noite Preciso de Ajuda por Favor, eu criptografei o meu hotmail na minha maquina, eu na verdade naum sei como fiz isso, mas qdo tento acessar o meu e-mail ele aparece com o cadeado de segurança e diz. essa conexão com o servidor foi criptogradado. me ajudem naum sei o q fazer.
sendo só agradeço.
silmara
Nome : E-Mail :
Nome : leonardo E-Mail : nthalassa@hotmail.com
Esse exemplo está errado.
Não descriptografa!!!
O cara não testou o que escreveu antes de postar?
Nome : Rogério E-Mail : rogerio.colett@hotmail.com
Aqui funcionou, usei tudo em C#.

Notas.
Em :
Private Function formatarMensagem(ByVal mensagem As Byte()) As String
Dim r As String
Dim a As Integer
For a = 0 To hash.Length - 1
r &= Hex(mensagem(a)) & " "
Next
Return (Trim(r)) <<<<<<< retire o Trim
End Function
------------------------------------------------
Em:
Private Function DesCriptografar(ByVal mensagem As String) As String
Dim enc As ICryptoTransform
enc = obj.CreateDecryptor()
obj.key=vchave
obj.iv=vIV
enc = obj.CreateDencryptor() <<<<<<<<< Adicione esta linha
b = enc.TransformFinalBlock(interpretarmensagem(mensagem), 0, len(mensagem)) <<<< Altere len(mensagem) p/ len(interpretarmensagem(mensagem))
return(ASCII.GetString(b))
End Function
Nome : Dennes E-Mail : dennes@bufaloinfo.com.br
Oi, Rogério,

Legal que tenha funcionado, mas cuidado com as mudanças.

O algorítimo do for que você apontou deixa um espaço em branco adicional na variável r, por isso o trim.

Já no 2o exemplo que apontou, repare que você mesmo duplicou a instrução, ela já está lá.

Abs,

Dennes
Nome : coYhAkMD E-Mail : janemm@oi.com.br
Ol Matheus,A criptografia sem d vida uma tima (se n o a molehr) forma de manter os dados no computador (ou m dias) armazenados de forma segura. Pena que muitos n o se preocupam com isso.Eu mesmo tenho arquivos criptografados no pendrive, HD e HD externo. Vai saber que minhas informa es caem em m os erradas hein =)Parab ns pelo post!Abra os.
Nome : nXoSBbmG8k4c E-Mail : b095paxc@mail.com
1. Pick up Retro Air Jordans to derive supoirer performancehow to make jordan shoes-The Air Jordan Retro series is one of themost successful and powerful shoes ever created by Nike. The Jordanshoes in this series have been created from different types and formof inspirations and that is one of the reasons why they stand highabove in terms of quality performance and supoirer design.
Nome : mDavg4RD E-Mail : jvcv66t7@hotmail.com
Well as a lay man, what I understand is that the carbon in the air does not let sunlight escape once it enters the atmosphere. So, because carbon holds on to sunlight, it increases the atmospheric teaprrmtuee. At the same time too much carbon blocks sunlight, and so it brings about a dimming phenomena.

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Conheça mais sobre o nosso site :

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::



Quer saber mais?
Faça um curso na Búfalo Informática, Treinamento e Consultoria e
Prepare-se para o Mercado!
Veja o que a Búfalo tem para você.

ļæ½ BĆŗfalo InformĆ”tica, Treinamento e Consultoria - Rua Ɓlvaro Alvim, 37 Sala 920 - CinelĆ¢ndia - Rio de Janeiro / RJ
Tel.: (21)2262-1368 (21) 9240-5134 (21) 9240-7281 e-Mail:
contato@bufaloinfo.com.br