Codificação Rijndael com base 64 em CSharp

06/07/2017

0

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.
Bruno Velho

Bruno Velho

Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar