Obfuscar dados
Olá pessoal, a minha intenção é mostrar como é fácil misturar alguns dados com rapidez e segurança. Mostrarei o exemplo sendo aplicado com aplicação windows form, porém pode ser usada da mesma forma em vários outros tipos de aplicações como: web form ou pocketc pc.
Pré-requisitos:
- Visual Studio.NET 2005;
- Conhecimento avançado C#.NET;
- Disposição para aprender e ser pró-ativo.
Antes de tudo, volto com as minhas frases criptografadas, tente descriptografar e guanhará um prêmio se for um dos primeiros.
Nf nboef f-nbjl dpn p ujuvmp: Eftdsjquphsbgfj b gsbtd qfsgfjubnfouf.
Para o começo, criei um projeto com o nome de WindowsAplication1. Dentro dele criei um form chamado Form2.cs. Por enquanto está bem básico, tente seguir passo a passo.
Na referência 1.1 mostra como foi montado o layout da janela, porém o que quero mostrar é apenas a funcionalidade em si e para que vá servir daqui pra frente.

Referência: 1.1
Propriedades do form:
|
Nome do form: Form2
Objetos de tela:
TextBox
Id = textBox1
TextBox
Id = textBox2
Button
Id = button1
Text = Obfuscador
Button
Id = button2
Text = DesObfuscar
|
Referência: 1.2
Com o layout pronto e simples de montar, passo para codificação bruta.
Criei uma classe chamada Obfuscator.cs, que será responsável em codificar e decodificar o valor passado pela classe anterior.
|
using System;
using System.Collections.Generic;
using System.Text;
namespace Obfuscator.Application
{
/// <summary>
/// Contém metodos para obfuscar os valores da registry.
/// </summary>
/// <remarks>
/// </remarks>
internal static class Obfuscator
{
private const byte keyObfuscator = (byte)15;
/// <summary>
/// Obfusca valor especificado.
/// </summary>
/// <param name="valor">Valor convertido para bytes para ser obfuscado.</param>
/// <returns>Array de bytes obfuscado.</returns>
internal static byte[] ObfuscateValue(byte[] valor)
{
byte[] retorno = new byte[valor.Length];
for (int i = 0; i < valor.Length; i++)
{
retorno[i] = (byte)(valor[i] + Obfuscator.keyObfuscator);
}
return retorno;
}
/// <summary>
/// Retorna valor valor limpo para o valor obfuscado especificado.
/// </summary>
/// <param name="valor">Valor Obfuscado.</param>
/// <returns></returns>
internal static byte[] GetClearObfuscatedValue(byte[] valor)
{
byte[] retorno = new byte[valor.Length];
for (int i = 0; i < valor.Length; i++)
{
retorno[i] = (byte)(valor[i] - Obfuscator.keyObfuscator);
}
return retorno;
}
}
}
|
Referência: 1.3
Explicação:
O código em si está todo comentado para entendimento.
Criei uma constante chamada KeyObfuscator com (byte) 15, criei dois métodos onde uso um para misturar valores e outro para tirar a mistura.
|
internal static byte[] ObfuscateValue(byte[] valor)
{
byte[] retorno = new byte[valor.Length];
for (int i = 0; i < valor.Length; i++)
{
retorno[i] = (byte)(valor[i] + Obfuscator.keyObfuscator);
}
return retorno;
}
|
Referência: 1.4
Na analise da assinatura do método, coloquei internal e recebe um valor do tipo byte, ou seja o valor que deve ser mandado é todo tipo byte[]. Logo depois pego a quantidade de caracteres enviados com a linha Length.
Com o próximo passo, faço um for onde pego valor de cada caracter e somo com o valor de minha constante criada no começo da classe. No final retorno os dados. Esse método da referência 1.4 é para misturar os dados passados.
|
internal static byte[] GetClearObfuscatedValue(byte[] valor)
{
byte[] retorno = new byte[valor.Length];
for (int i = 0; i < valor.Length; i++)
{
retorno[i] = (byte)(valor[i] - Obfuscator.keyObfuscator);
}
return retorno;
}
|
Referência: 1.5
O método da referência 1.5 é para quebrar o valor obfuscado e transformar em valor normal digitado pelo usuário. Faço à mesma coisa com esse outro método, pego a quantidade de caracteres passados, depois faço um for diminuindo o valor de minha constante. Depois retorno o valor.
Programando Form2
Com os botões e texts do form2 já colocados, sigo o passo de programar e chamar os valores que quero misturar. Cliquei duas vezes em cima button1 e coloquei o código referência 1.6.
|
private void button1_Click(object sender, EventArgs e)
{
string text1 = textBox1.Text.ToUpper();
byte[] bytesValores = this.encoder.GetBytes(text1);
byte[] aux = Obfuscator.Application.Obfuscator.ObfuscateValue(bytesValores);
resultado = encoder.GetString(aux) ;
textBox2.Text = resultado;
}
|
Referência: 1.6
Explicação:
Transformei o valor do TextBox1 para caixa alta atribuindo a uma string text1. Criei uma variável bytesValores[] atribuindo o valor text1 transformando para pegar o resultado em Bytes com o código this.encorder.GetBytes(text1).
Criei uma variável com o nome aux, cujo não é aconselhável, pegando o valor retornado do método ObfuscateValue passando o valor bytesValores; ou seja; chamo o método criado anteriormente passando o valor transformado em byte. Com o resultado do mesmo, utilizo o enconder para pegar o GetString passando o valor aux retornado do método misturador. Até o momento não falei nada do encorder, falarei mais a frente.
Seguindo para a programação do button2, dei um duplo clique e digitei a linha de código referência 1.7.
|
private void button2_Click(object sender, EventArgs e)
{
byte[] bytesValores = this.encoder.GetBytes(resultado);
byte[] obj = Obfuscator.Application.Obfuscator.GetClearObfuscatedValue(bytesValores);
textBox1.Text = encoder.GetString(obj);
}
|
Referência: 1.7
Explicação:
Peguei o valor de minha variável resultado armazenada anteriormente pegando o GetBytes, depois criei uma outra variável com o nome obj do tipo byte[] atribuindo o retorno do método GetClearObsfuscatedValeu, cujo foi feito anteriormente. Atribui o valor do obj ao meu Text1 pegando o meu GetString(obj). Simples, fácil e rápido.
A referência 1.8 mostra o código o form2.cs todo construído. Inclusive o enconder comentado anteriormente está declarado no início do código.
|
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace WindowsApplication1
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private Encoding encoder = new System.Text.UTF8Encoding();
string resultado = string.Empty;
private void button1_Click(object sender, EventArgs e)
{
string text1 = textBox1.Text.ToUpper();
byte[] bytesValores = this.encoder.GetBytes(text1);
byte[] aux = Obfuscator.Application.Obfuscator.ObfuscateValue(bytesValores);
resultado = encoder.GetString(aux) ;
textBox2.Text = resultado;
}
private void button2_Click(object sender, EventArgs e)
{
byte[] bytesValores = this.encoder.GetBytes(resultado);
byte[] obj = Obfuscator.Application.Obfuscator.GetClearObfuscatedValue(bytesValores);
textBox1.Text = encoder.GetString(obj);
}
}
}
|
Referência: 1.8
Testando aplicação:
Depois de compilar a aplicação, cliquei F5 e digitei mauricio@ascompras.com e cliquei no botão OBFUSCADOR. (Referência 1.9)

Referência: 1.9
Depois apaguei o valor do text1, (mauricio@ascompras.com) e cliquei no botão DesObfuscar, o mesmo pegará o valor do text2 e transformar os dados mostrando no text1. (Referência 1.10 e 1.11).

Referência: 1.10

Referência: 1.11
