Codificação Rijndael com base 64 em CSharp
Estou fazendo uma criptografia Rijndael e imagino que estou próximo de acaba-la porém ao desencriptar estou com o erro
Comprimento inválido dos dados a serem descriptografados.
Seguem os códigos:
Segue codificação também para gerar a chave, que estou usando um hash md5, senha padrão 123.
Agradeço desde já se alguem puder me dar uma luz, sobre o motivo de estar ocorrendo este erro, estou executando em aplicação console no caso apenas para testes.
Comprimento inválido dos dados a serem descriptografados.
Seguem os códigos:
using System; using System.Security.Cryptography; using System.IO; using System.Diagnostics; namespace CriptoRijndael { using System.Text; using static Array; class EncoderRijndael { public static Rijndael InstanciaRijndael() { Rijndael cripto = Rijndael.Create(); cripto.KeySize = 128; cripto.Mode = CipherMode.CBC; cripto.Padding = PaddingMode.PKCS7; //cripto.GenerateKey(); //= Encoding.ASCII.GetBytes(key); //associação à propriedade Key cripto.GenerateIV(); //= Encoding.ASCII.GetBytes(iv); //associação à propriedade do vetor de inicialização IV. cripto.Key = CriptoMD5.EncoderMD5.EncodeMD5(md5generate: "123"); return cripto; } public static string Encripta(string plaintext) { using (Rijndael cripto = InstanciaRijndael()){ //instanciada a classe Rijndael ICryptoTransform encrypt = cripto.CreateEncryptor(cripto.Key, cripto.IV); //objeto encrypt para a execução das operações de transformação de criptografia. using (MemoryStream streamResultado = new MemoryStream()) //instancia a memória para armazenamento em memory stream. { using (CryptoStream cStream = new CryptoStream(streamResultado, encrypt, CryptoStreamMode.Write)) //instanciado a classe crypto stream para referenciar que a //será feita fluxo Crypto Transform e memory stream { using (StreamWriter writer = //instanciado o stream writer para indicar que será feito o processo de escrita de dados criptografados no objeto memory stream new StreamWriter(cStream)) { writer.Write(plaintext); //associando o texto em que será criptografado. } } String concat = System.Text.Encoding.UTF8.GetString(cripto.IV); String auxMStream = System.Text.Encoding.UTF8.GetString(streamResultado.ToArray()); String.Concat(concat, auxMStream); concat.Trim(); var debyte64 = Encoding.UTF8.GetBytes(concat); concat = Convert.ToBase64String(debyte64); return concat; } } } public static string Decripta(string concat, string textdecrypted) { var concaat = Convert.FromBase64String(concat); concaat = Encoding.UTF8.GetBytes(concat); using (var cripto = InstanciaRijndael()) { int btLength = concat.Length - 16; byte[] decryBT = new byte[btLength]; Copy(concaat, 1, decryBT, 0, btLength); //System.Text.Encoding.UTF8.GetBytes(newIV); byte[] newIV = new byte[16]; Copy(concaat, newIV, 16); cripto.IV = newIV; var decrypt = cripto.CreateDecryptor(cripto.Key, cripto.IV); using (var streamCryptText = new MemoryStream(decryBT)) { using (var cStream = new CryptoStream(streamCryptText, decrypt, CryptoStreamMode.Read)) { using (var reader = new StreamReader(cStream)) { textdecrypted = reader.ReadLine(); } } } } return textdecrypted; } } }
using System; namespace ConsoleApp2 { using System.Diagnostics; class Executa {class Program { public static void Main(string[] args) { var keyRij = CriptoRijndael.EncoderRijndael.Encripta(plaintext: "teste cripto"); String textdecrypted = ""; CriptoRijndael.EncoderRijndael.Decripta(concat: keyRij, textdecrypted: textdecrypted); Console.WriteLine(textdecrypted); Console.ReadLine(); } } } }
Segue codificação também para gerar a chave, que estou usando um hash md5, senha padrão 123.
using System; using System.Collections.Generic; using System.Linq; using System.Security.Cryptography; using System.Text; namespace CriptoMD5 { class EncoderMD5 { public static byte[] EncodeMD5(String md5generate) { MD5 md5Hash = MD5.Create(); byte[] data = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(md5generate)); // converte para array de bytes StringBuilder sb = new StringBuilder(); foreach (byte t in data) //formatar byte para string decimal { sb.Append(t.ToString("x2")); } var key = Encoding.ASCII.GetBytes(sb.ToString()); return key; } } }
Agradeço desde já se alguem puder me dar uma luz, sobre o motivo de estar ocorrendo este erro, estou executando em aplicação console no caso apenas para testes.
Bruno Velho
Curtidas 0