Visual Basic 6 - Criptografando e DecriptoGrafando textos

"A escrita cifrada é uma "mania" muito antiga. Foi só o homem inventar o alfabeto e começar a escrever que logo surgiu a vontade de escrever textos secretos. Os segredo ou códigos utilizados para criar uma mensagem cifrada evoluíram lentamente.

No início, havia poucas pessoas que sabiam escrever e pouca necessidade de esconder o conteúdo de qualquer mensagem.

"Cripto" vem do grego "kryptos" e significa oculto, envolto, escondido. Também do grego, "graphos" significa escrever, "logos" significa estudo, ciência e "analysis" significa decomposição

Hoje em dia a criptografia voltou a ser muito utilizada devido à evolução dos meios de comunicação, à facilidade de acesso a estes meios e ao volume muito grande de mensagens enviadas. Telefone fixo e celular, fax, e-mail, etc. são amplamente utilizados e nem sempre os usuários querem que o conteúdo seja público. Devido a isto, a criptografia evoluiu muito nos últimos tempos.

As palavras, caracteres ou letras da mensagem original inteligível constituem o Texto ou Mensagem Original, como também Texto ou Mensagem Clara. As palavras, caracteres ou letras da mensagem cifrada são chamados de Texto Cifrado, Mensagem Cifrada ou Criptograma.

O processo de converter Texto Original em Texto Cifrado é chamado de composição de cifra e o inverso é chamado de decifração. Curioso é que não existe uma palavra em Português como "encifração", "cifragem" ou "encriptação" - existe apenas "compor cifras". Mesmo assim, no decorrer do texto, vou utilizar os termos encriptação/cifragem com o significado de compor cifras.(Viktoria, 2005)

Na prática, qualquer mensagem cifrada é o resultado da aplicação de um SISTEMA GERAL (ou algorítmo), que é invariável, associado a uma CHAVE ESPECÍFICA, que pode ser variável. É óbvio que tanto o remetente quanto o destinatário precisam conhecer o sistema e a chave.

A criptologia existe como ciência há apenas 20 anos. Até então era considerada como arte. A International Association for Cryptologic Research (IACR) é a organização científica internacional que mantém a pesquisa nesta área.

Com esta introdução teórica referenciada busquei ilustrar o assunto. A seguir vamos abordar uma rotina ,  recebida e adaptada de um colaborador, que podemos usar para criptografar ou compor cifras de textos usando o Visual Basic.

Para saber mais leia o meu artigo em : VB - Criptografia e segurança. É possivel ?

Creio que uma aplicação imediata desta rotina seria a 'cifragem' de texto contendo senhas e informações sigilosas.

Antes de passar ao código vou mostrar a base teórica que esta por trás da rotina que gera o texto criptografado.

Temos basicamente os seguintes elementos :

1- Um texto a codificar
2- Uma chave de criptografia (chave simétrica)

O objetivo é usar a chave de conhecimento restrito para cifrar o texto. O caminho de volta somente é possível (na teoria) para quem conhece a chave. O que o código faz é obter os caracteres ASC do texto e da chave através da soma dos dois números obter um novo número que será convertido em texto e que será o texto criptografado. Ilustrando teríamos: 

Texto a Codificar macoratti
Códigos ASCII 109 97 99 111 114 97 116 116 105
Chave privada KEY
Caaracteres da chave 75  69  89  75   69  89   75   69  89
Soma dos caracteres 184 166 174 180 189 166 191 185 180
Conversão para  Caracteres ¸¦®´½¦¿¹´

Executando o código com os comandos de debug teríamos o seguinte resultado na janela Immediate:

KEY=> 75 69 89
macoratti => 109 97 99 111 114 97 116 116 105
Criptografando
184 ¸
166 ¸¦
174 ¸¦®
180 ¸¦®´
189 ¸¦®´½
166 ¸¦®´½¦
191 ¸¦®´½¦¿
185 ¸¦®´½¦¿¹
180 ¸¦®´½¦¿¹´

Obs: KEY é chave que usei para este código você pode usar qualquer outra chave desde que seja menor que o texto a ser cifrado.

Vamos agora ao código do projeto:

Inicie um novo projeto no Visual Basic do tipo Standard EXE e no formulário padrão inclua os seguintes controles :

Conforme a figura abaixo:

Inclua um módulo no seu projeto com o nome de cripto.bas e insira nele o seguinte código:

Option Explicit
'//Define os parametros para as ações em EncryptString
Public Const ENCRYPT = 1, DECRYPT = 2

Public Function EncryptString(UserKey As String, Text As String, Action As Single) As String
    
    'define as variaveis usadas
    Dim UserKeyX As String
    Dim Temp     As Integer
    Dim Times    As Integer
    Dim i        As Integer
    Dim j        As Integer
    Dim n        As Integer
    Dim rtn      As String
    
    '//Obtem os caracteres da chave do usuário
    'define o comprimento da chave do usuario usada na criptografia
    n = Len(UserKey)
    
    'redimensiona o array para o tamanho definido
    ReDim userKeyASCIIS(1 To n)
    
    'preenche o array com caracteres asc
    Debug.Print UserKey; "=> ";
    For i = 1 To n
        userKeyASCIIS(i) = Asc(Mid$(UserKey, i, 1))
        Debug.Print userKeyASCIIS(i); " ";
    Next
        
    '//redimensiona o array com o tamanho do texto
    'obtem o caractere de texto
    ReDim TEXTAsciis(Len(Text)) As Integer
    
    'preenche o array com caracteres asc
    Debug.Print
    Debug.Print Text; " => ";
    For i = 1 To Len(Text)
        TEXTAsciis(i) = Asc(Mid$(Text, i, 1))
        Debug.Print TEXTAsciis(i); " ";
    Next
    
    '//cifra/decifra
    Debug.Print
    Debug.Print "Criptografando"
    If Action = ENCRYPT Then
       For i = 1 To Len(Text)
           j = IIf(j + 1 >= n, 1, j + 1)
           Temp = TEXTAsciis(i) + userKeyASCIIS(j)
           If Temp > 255 Then
              Temp = Temp - 255
           End If
           Debug.Print Temp; " ";
           rtn = rtn + Chr$(Temp)
           Debug.Print rtn
       Next
    ElseIf Action = DECRYPT Then
       For i = 1 To Len(Text)
           j = IIf(j + 1 >= n, 1, j + 1)
           Temp = TEXTAsciis(i) - userKeyASCIIS(j)
           If Temp < 0 Then
              Temp = Temp + 255
           End If
           rtn = rtn + Chr$(Temp)
       Next
    End If
    
    '//Retorna o texto
    EncryptString = rtn
End Function

 

Obs: Remova os comandos Debug.Print quando for usar a rotina em seu projeto

O código da função EncryptString() faz exatamente o que explicamos , recebe um texto , uma chave e um parâmetro indicando qual a operação a ser realizada: cifrar ou decifrar.

O código do formulário que usa a função é o seguinte :

Private Sub cmdCripto_Click()
  '//Codifica
  txtCripto.Text = ""
  txtCripto.Text = EncryptString("KEY", txtOrigem.Text, ENCRYPT)
End Sub
Private Sub cmdDeCripto_Click()
  '//DeCodifica
  txtDeCripto.Text = ""
  txtDeCripto.Text = EncryptString("KEY", txtCripto.Text, DECRYPT)
End Sub
Private Sub cmdSair_Click()
  Me.Close
End Sub
Private Sub Command1_Click()
   txtOrigem.Text = ""
  txtCripto.Text = ""
  txtDeCripto.Text = ""
End Sub

 

O resultado da execução do projeto exibindo a cifragem e a decifragem é mostrado na figura abaixo:

Dentre os algoritmos de chave única são :

Algoritimo DES chave de 56 bits 16 passos XOR, SHIFT
Triple DES 112 ou 168 bits 48 passos XOR, SHIFT
IDEA 128 bits 8 passos XOR, adição , multiplicação
RCS até 2048 bits até 255 passos add, sub, XOR , rot

O método usado é muito simples e a efetuar o processo inverso também é muito fácil , para torná-lo mais robusto , implemente no código uma chave aleatória usando um chave pública.

Vamos então implementar um método um pouco mais seguro, ou seja , mais complicado de ser revertido.

Neste método vamos usar duas chaves : uma chave pública que pode ser de conhecimento geral e outra aleatória.

Inicie um novo projeto no Visual Basic do tipo Standard EXE e no formulário padrão inclua os seguintes controles :

Acima temos o projeto exibindo o resultado da cifragem. Vamos ao código:

As duas funções principais que vão gerenciar a chave e fazer a cifragem são :

- caractereAleatorio()
- SegredoSeguro()

Option Explicit
Dim chavealeatoria As String
Dim chave As String
'--------------------------------------------------
' Retorna uma string randomica de caracteres ASCII
'--------------------------------------------------
Public Function caractereAleatorio() As String
    Dim Char    As String
    Dim RndStr  As String
    Dim n       As Integer
    
    Randomize Timer
    Do
       Char = Chr$(Int(Rnd * 256))
       If InStr(RndStr, Char) = 0 Then
          n = n + 1
          RndStr = RndStr + Char
       End If
    Loop Until n = 256
        
    caractereAleatorio = RndStr
End Function
Public Function SegredoSeguro(Text As String, SStr As String, EStr As String) As String
    Dim i   As Integer
    Dim rtn As String
    
    For i = 1 To Len(Text)
        rtn = rtn + Mid$(EStr, InStr(SStr, Mid$(Text, i, 1)), 1)
    Next
    SegredoSeguro = rtn
End Function

 

Para usar as funções basta colocar a chamada para cifrar e decifrar conforme abaixo:


    
Private Sub cmdCifrar_Click()
Dim i As Integer
chavealeatoria = caractereAleatorio()
    
For i = 0 To 255
    chave = chave + Chr$(i)
Next
    
'//Codifica
txtCifrado.Text = SegredoSeguro(txtOrigem.Text, chave, chavealeatoria)

End Sub

Private Sub cmdDecifrar_Click()
    
'//Decodifica
txtDecifrado.Text = SegredoSeguro(txtCifrado.Text, chavealeatoria, chave)

End Sub

 

A rotina acima usa o que costuma se chamar de chave assimétrica e gera uma cifragem bem mais complicada de ser revertida.

Nota : Mesmo este algoritimo, um pouco mais seguro, revela sua fragilidade no fato de não alternar o caractere cifrado para uma letra repetida no texto. Geralmente usa-se substituição e transposição para que este efeito seja conseguido e torne o processo inverso muito mais complicado. Para mais detalhes sobre o assunto procure por codificador de Feistel.

O VB.NET oferece várias classes que torna o tratamento deste assunto muito mais fácil para o desenvolvedor. Aguarde que em breve tratarei deste assunto sob a ótica .NET.

Por hoje é só isto... Até mais

Pegue os projetos completos aqui :   1-) vbcripto.zip     e  2-) vbcripto2.zip

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

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ?

 

Referências:


José Carlos Macoratti