public class Criptografia
{
/// <summary>
/// Vetor de bytes utilizados para a criptografia (Chave Externa)
/// </summary>
private static byte[] bIV =
{ 0x50, 0x08, 0xF1, 0xDD, 0xDE, 0x3C, 0xF2, 0x18,
0x44, 0x74, 0x19, 0x2C, 0x53, 0x49, 0xAB, 0xBC };
/// <summary>
/// Representação de valor em base 64 (Chave Interna)
/// O Valor representa a transformação para base64 de
/// um conjunto de 32 caracteres (8 * 32 = 256bits)
/// A chave é: "Criptografias com Rijndael / AES"
/// </summary>
private const string cryptoKey = "Q3JpcHRvZ3JhZmlhcyBjb20gUmluamRhZWwgLyBBRVM=";
/// <summary>
/// Metodo de criptografia de valor
/// </summary>
/// <param name="text">valor a ser criptografado</param>
/// <returns>valor criptografado</returns>
public static string Encrypt(string text)
{
try
{
// Se a string não está vazia, executa a criptografia
if (!string.IsNullOrEmpty(text))
{
// Cria instancias de vetores de bytes com as chaves
byte[] bKey = Convert.FromBase64String(cryptoKey);
byte[] bText = new UTF8Encoding().GetBytes(text);
// Instancia a classe de criptografia Rijndael
Rijndael rijndael = new RijndaelManaged();
// Define o tamanho da chave "256 = 8 * 32"
// Lembre-se: chaves possíves:
// 128 (16 caracteres), 192 (24 caracteres) e 256 (32 caracteres)
rijndael.KeySize = 256;
// Cria o espaço de memória para guardar o valor criptografado:
MemoryStream mStream = new MemoryStream();
// Instancia o encriptador
CryptoStream encryptor = new CryptoStream(
mStream,
rijndael.CreateEncryptor(bKey, bIV),
CryptoStreamMode.Write);
// Faz a escrita dos dados criptografados no espaço de memória
encryptor.Write(bText, 0, bText.Length);
// Despeja toda a memória.
encryptor.FlushFinalBlock();
// Pega o vetor de bytes da memória e gera a string criptografada
return Convert.ToBase64String(mStream.ToArray());
}
else
{
// Se a string for vazia retorna nulo
return null;
}
}
catch (Exception ex)
{
// Se algum erro ocorrer, dispara a exceção
throw new ApplicationException("Erro ao criptografar", ex);
}
}
/// <summary>
/// Pega um valor previamente criptografado e retorna o valor inicial
/// </summary>
/// <param name="text">texto criptografado</param>
/// <returns>valor descriptografado</returns>
public static string Decrypt(string text)
{
try
{
// Se a string não está vazia, executa a criptografia
if (!string.IsNullOrEmpty(text))
{
// Cria instancias de vetores de bytes com as chaves
byte[] bKey = Convert.FromBase64String(cryptoKey);
byte[] bText = Convert.FromBase64String(text);
// Instancia a classe de criptografia Rijndael
Rijndael rijndael = new RijndaelManaged();
// Define o tamanho da chave "256 = 8 * 32"
// Lembre-se: chaves possíves:
// 128 (16 caracteres), 192 (24 caracteres) e 256 (32 caracteres)
rijndael.KeySize = 256;
// Cria o espaço de memória para guardar o valor DEScriptografado:
MemoryStream mStream = new MemoryStream();
// Instancia o Decriptador
CryptoStream decryptor = new CryptoStream(
mStream,
rijndael.CreateDecryptor(bKey, bIV),
CryptoStreamMode.Write);
// Faz a escrita dos dados criptografados no espaço de memória
decryptor.Write(bText, 0, bText.Length);
// Despeja toda a memória.
decryptor.FlushFinalBlock();
// Instancia a classe de codificação para que a string venha de forma correta
UTF8Encoding utf8 = new UTF8Encoding();
// Com o vetor de bytes da memória, gera a string descritografada em UTF8
return utf8.GetString(mStream.ToArray());
}
else
{
// Se a string for vazia retorna nulo
return null;
}
}
catch (Exception ex)
{
// Se algum erro ocorrer, dispara a exceção
throw new ApplicationException("Erro ao descriptografar", ex);
}
}
}
Como eu altero o valor de bIV na minha classe de forma que no meu código não fique igual ao seu?
Como eu altero o valor da cryptoKey, de forma a gerar a minha própria chave criptografada?
Ola Bruno !!!
Bem a chave de código em byte esta gerada por padrão, nesse caso trabalha externamente ao programa para gerar uma chave com a cryptoKey, nesse caso só altere a cryptoKey com um conjunto de caracteres correspondentes que você desejar, isso já é o suficiente para alterar a chave criptografada, alterando assim sua criptografia.
🙂
Wendell Santos
Olá amigo, está faltando a classe Rijndael, não está não?
Ah, está disponível a partir do framework 3.5.. vi só agora, mals k
Perfeito, funcionando perfeitamente!
O problema é quando a classe tem que ser instanciada de alguma outra classe, se criptografada e descriptografada na mesma instanciação funciona perfeitamente. Porém se for utilizada em vários projetos, lendo criptografada e descriptografando para utiliza-la ela não te traz 100%.
Tenta deixar ela .dll e importa para o projeto em questão…Pode dar certo…
Boa tarde, funcionou direitinho, só não consegui guardar a senha criptografada no banco de dados firebird, na minha tabela o campo que guarda a senha é varchar, será que é o tipo do campo que esta errado? return Convert.ToBase64String(mStream.ToArray()); como se pode ver o return devolve base64, alguma ideia?
Ola Vinicius, td bem ?? Então na verdade você vai utilizar o método Encrypt e Decrypt, ambos recebem o parametro String e tem o retorno de String (String (retorna o texto encriptado) Encrypt(String recebe o texto a ser encriptado) , String (retorna o texto encriptado, desencriptado) Decrypt(recebe o texto encriptado), na verdade se voce trabalahr com esses 2 metodos de encriptar e desencriptar ele sozinho faz todo o trabalho na questão de armazenar no banco de dados, dependendo do campo que você esta trabalhando (varchar ou Nvarchar ou Text) esse campo deve ser grande o suficiente para guardar o texto encriptado, sugiro que coloque não menos de 300 de tamanho nesse campo de texto ou mais depende do que você deseja persistir no banco…
Muito Bom!.. Parabéns!