Codificação Rijndael com base 64 em CSharp

06/07/2017

1

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:

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.
Responder