Шифрование AES с использованием класса RijndaelManged: кодирование и декодирование строки шифрования Baes64 aes

Итак, у меня возникла проблема с расшифровкой декодированной строки base64 aes. Это возможно? Я написал небольшую консольную программу, чтобы решить эту проблему, но не повезло. Вот мой пример:

введите здесь описание изображения

Как показано, я успешно преобразовал base64 обратно в зашифрованную строку aes, но когда я пытаюсь расшифровать ее, я получаю больше мусора. Если нужен фрагмент кода, дайте мне. Всем спасибо за помощь :) ОБНОВЛЕНИЕ: Фрагмент кода для метода расшифровки

static void Main(string[] args)
    {
        string plainText;
        string decrypted;
        string decryptedFromB64EncodedDecoded;
        string fromBase64ToEncryptedText;
        string encryptedText;
        string encryptedTextBase64;
        byte[] encryptedBytes;

        byte[] encryptedBytes2;
        byte[] encryptedBytesBase64;

        RijndaelManaged crypto = new RijndaelManaged();

        UTF8Encoding UTF = new UTF8Encoding();

        Console.WriteLine("Please put in the text to be encrypted.");
        plainText = Console.ReadLine();

        try
        {
            encryptedBytes = encrypt(plainText, crypto.Key, crypto.IV);
            encryptedText = Encoding.ASCII.GetString(encryptedBytes);
            //encryptedBytes2 = Encoding.ASCII.GetBytes(encryptedText);

            encryptedTextBase64 = toBase64String(encryptedText);
            encryptedBytesBase64 = fromBase64String(encryptedTextBase64);

            fromBase64ToEncryptedText = Encoding.ASCII.GetString(encryptedBytesBase64);

            encryptedBytes2 = Encoding.ASCII.GetBytes(fromBase64ToEncryptedText);

            decrypted = decrypt(encryptedBytes, crypto.Key, crypto.IV);
            decryptedFromB64EncodedDecoded = decrypt(encryptedBytes2, crypto.Key, crypto.IV);

            Console.WriteLine("Start: {0}", plainText);
            Console.WriteLine("Encrypted: {0}", encryptedText);
            Console.WriteLine("Encrypted Base64: {0}", encryptedTextBase64);
            Console.WriteLine("From Base64 To AES Encypted Text: {0}", fromBase64ToEncryptedText);
            Console.WriteLine("Decrypted: {0}", decrypted);

            Console.WriteLine("Decrypted From Encode and then Decode Base64 Text: {0}", decryptedFromB64EncodedDecoded);

        }
        catch (Exception ex)
        {
            Console.WriteLine("Exception: {0}", ex.Message);
        }

        Console.ReadLine();
    }

public static string decrypt (byte[] textToDecrypt, byte[] key, byte[] IV)
    {
        RijndaelManaged crypto = new RijndaelManaged();
        MemoryStream stream = new MemoryStream(textToDecrypt) ;
        ICryptoTransform decryptor = null;
        CryptoStream cryptoStream = null;
        StreamReader readStream = null;

        string text = string.Empty;

        try
        {
            crypto.Key = key;
            crypto.IV = IV;
            crypto.Padding = PaddingMode.None;

            decryptor = crypto.CreateDecryptor(crypto.Key, crypto.IV);
            cryptoStream = new CryptoStream(stream, decryptor, CryptoStreamMode.Read);
            //cryptoStream.Read(textToDecrypt, 0, textToDecrypt.Length);
            readStream = new StreamReader(cryptoStream);
            text = readStream.ReadToEnd();
            cryptoStream.Close();

            byte[] decodedValue = stream.ToArray();

            return text;
        }
        catch (Exception)
        {
            throw;
        }
        finally
        {
            if (crypto != null)
            {
                crypto.Clear();
            }
            stream.Flush();
            stream.Close();
        }
    }

public static byte[] encrypt(string text, byte[] key, byte[] IV)
    {
        RijndaelManaged crypto = null;
        MemoryStream stream = null;

        //ICryptoTransform is used to perform the actual decryption vs encryption, hash function are a version crypto transforms
        ICryptoTransform encryptor = null;
        //CryptoStream allows for encrption in memory
        CryptoStream cryptoStream = null;

        UTF8Encoding byteTransform = new UTF8Encoding();

        byte[] bytes = byteTransform.GetBytes(text);

        try
        {
            crypto = new RijndaelManaged();
            crypto.Key = key;
            crypto.IV = IV;

            stream = new MemoryStream();

            encryptor = crypto.CreateEncryptor(crypto.Key, crypto.IV);
            cryptoStream = new CryptoStream(stream, encryptor, CryptoStreamMode.Write);
            cryptoStream.Write(bytes, 0, bytes.Length);

        }
        catch (Exception)
        {

            throw;
        }
        finally
        {
            if (crypto != null)
            {
                crypto.Clear();
            }
            cryptoStream.Close();
        }

        return stream.ToArray();
    }

 public static string toBase64String(string value)
    {
        UTF8Encoding UTF = new UTF8Encoding();
        byte[] myarray =  UTF.GetBytes(value);
        return Convert.ToBase64String(myarray);
    }

    public static byte[] fromBase64String(string mystring)
    {
        //UTF8Encoding UTF = new UTF8Encoding();
        //byte[] myarray = UTF.GetBytes(value);
        return Convert.FromBase64String(mystring);
    }

person Joseph Freeman    schedule 02.12.2015    source источник
comment
Я не вижу вашего метода шифрования. Я что-то упускаю?   -  person MutantNinjaCodeMonkey    schedule 02.12.2015
comment
Позвольте мне опубликовать очень быстро, случайно пропустил это, лол.   -  person Joseph Freeman    schedule 02.12.2015
comment
Почти уверен, что ваша проблема в кодировке. Можете ли вы опубликовать методы toBase64String и fromBase64String.   -  person j-u-s-t-i-n    schedule 02.12.2015
comment
Да, конечно, дай мне секунду.   -  person Joseph Freeman    schedule 02.12.2015


Ответы (2)


Я не знаю, как вы расшифровываете, но перед тем, как расшифровать, вы должны преобразовать строку base 64 в массив байтов, прежде чем отправлять ее в расшифровку.

byte[] encryptedStringAsBytes = Convert.FromBase64String(base64EncodedEncryptedValue);

Затем с массивом байтов вы можете перейти к CryptoStream через MemoryStream.

ОБНОВЛЕНИЕ

Я считаю, что проблема в том, как вы настраиваете свои потоки

            using (RijndaelManaged rijndaelManaged = new RijndaelManaged())
            {
                rijndaelManaged.Padding = paddingMode;
                rijndaelManaged.Key     = key;
                rijndaelManaged.IV      = initVector;

                MemoryStream memoryStream = null;
                try
                {
                    memoryStream = new MemoryStream(valueToDecrypt);
                    using (ICryptoTransform cryptoTransform = rijndaelManaged.CreateDecryptor())
                    {
                        using (CryptoStream cryptoStream = new CryptoStream(memoryStream, cryptoTransform, CryptoStreamMode.Read))
                        {
                            using (StreamReader streamReader = new StreamReader(cryptoStream))
                            {
                                return streamReader.ReadToEnd();                       
                            }
                        }
                    }
                }
                finally
                {
                    if (memoryStream != null)
                        memoryStream.Dispose();
                }
            }    

ОБНОВЛЕНИЕ 2

Вот как вы должны в основном выполнять шаги.

Шифровать

  1. Закодируйте свою текстовую строку, используя Encoding.GetBytes(stringToEncrypt)
  2. передать byte[] в криптографический API (через поток памяти и т. д.)
  3. получить байты из зашифрованного потока и закодировать результаты как Base64

Расшифровать (сделать в обратном порядке)

  1. Преобразуйте строку в кодировке base64 в байты, используя Convert.FromBase64String(base64EncodedEncryptedValue)
  2. передайте этот массив байтов в вашу функцию расшифровки выше
person Jim    schedule 02.12.2015
comment
Эй :) Это именно то, что я делаю. Я обновлю код расшифровки, чтобы вы могли взглянуть на него, возможно, я делаю что-то не так, лол. - person Joseph Freeman; 02.12.2015
comment
Ладно, круто! Я попробую! Я дам вам знать, если это работает здесь в ближайшее время. - person Joseph Freeman; 02.12.2015
comment
На самом деле я предпочитаю возвращать SecureString.or byte[] - person Jim; 02.12.2015
comment
Я заметил, что вы не передали ключ и вектор инициализации в CreateDecryptor, разве это не нужно? - person Joseph Freeman; 02.12.2015
comment
Итак, я только что закончил рефакторинг своих потоков, и я получаю то же самое при декодировании строки base64, так что это исходная строка, зашифрованная aes, и расшифровка этой строки дает мне кучу мусора :( - person Joseph Freeman; 02.12.2015
comment
Должна быть сторона шифрования тогда. - person Jim; 02.12.2015
comment
Я использую ключ и вектор инициализации сразу после использования (RijndaelManaged rijndaelManaged = new RijndaelManaged()) - person Jim; 02.12.2015
comment
Ах, так что не нужно передавать их в rijndaelManaged.CreateDecryptor(), вот что делал. Кажется, работает в любом случае :) - person Joseph Freeman; 02.12.2015
comment
Это именно то, что я делаю :) Мне нужно что-то упустить, чтобы это не работало. Следует использовать ASCII.GetBytes или UTF8.GetBytes? На данный момент я использую ASCII.GetBytes. - person Joseph Freeman; 02.12.2015

Пытаться:

encryptedBytes2 = Encoding.ASCII.GetBytes(encryptedText);

На основании вашего комментария. Байты — это просто байты, поэтому, чтобы расшифровать зашифрованный текст, вам нужно отменить любую кодировку или серию кодировок, которые вы сделали.

Если вы действительно хотите перейти от Encrypted Bytes -> Base64String -> строка ASCII ->, то расшифровать эту строку ASCII? вам нужно будет base64 декодировать строку ascii, а затем преобразовать эту строку в байты, используя

Encoding.ASCII.GetBytes(yourdecodedstring); 

Обратите внимание, что декодирование base 64 отличается от использования Convert.FromBase84String.

person j-u-s-t-i-n    schedule 02.12.2015
comment
Это противоречит цели, которую я пытаюсь выполнить, а именно кодировать AES в строку base64, а затем декодировать base64 в зашифрованную строку AES, а затем расшифровывать ее. - person Joseph Freeman; 02.12.2015
comment
Итак, зашифрованные байты -> Base64String -> строка ASCII -> затем расшифровать эту строку ASCII? - person j-u-s-t-i-n; 02.12.2015
comment
Да :) но по какой-то причине, когда я получаю последний шаг расшифровки строки, дайте возврат строки нежелательной почты вместо строки foo. - person Joseph Freeman; 02.12.2015
comment
Чтобы расшифровать, вам нужно передать те же самые байты обратно. Вы не можете перейти от base64 к ASCII, а затем обратно к Base64 так, как вы это делаете. - person j-u-s-t-i-n; 02.12.2015
comment
Например, a в ASCII — это YQ== в базе 64. Если вы затем закодируете строку base64 в ASCII и base64, вы получите WVE9PQ==. Таким образом, вы не можете просто получить байты из WVE9PQ== и ожидать их расшифровки. Имеет ли это смысл? - person j-u-s-t-i-n; 02.12.2015
comment
Аааааа, хорошо хорошо. Одна вещь, которую я заметил, что второй byte[] был больше оригинала. Мне удалось исправить это с помощью Encoding.ASCII.GetString, и это дало одинаковое количество байтов, но то, что они имеют одинаковое количество байтов, не означает, что данные одинаковы. Я не думал о ...... Так что теперь мой вопрос в том, как добиться этого ....... - person Joseph Freeman; 02.12.2015
comment
Могу я спросить, почему вам нужно преобразовать его в ASCII? Возможно есть более простое решение. - person j-u-s-t-i-n; 02.12.2015
comment
Мне действительно не нужно преобразовывать в ASCII, если есть лучшее решение, то обязательно проболтайтесь, лол :) - person Joseph Freeman; 02.12.2015
comment
Тогда разве мой первоначальный ответ не решает проблему? зашифрованные байты2 = Encoding.ASCII.GetBytes (зашифрованный текст); Вы успешно зашифровали и расшифровали текст foo bar. Если вы хотите, чтобы эти байты хранились в ASCII или base64, просто преобразуйте их, но не забудьте преобразовать их обратно перед расшифровкой. - person j-u-s-t-i-n; 02.12.2015
comment
Да, я полностью облажался со своим шифрованием, дешифрованием, кодированием, декодированием. Когда вы упомянули, что я снова посмотрел на свой код и подумал, почему я это делаю… глупо, лол. Спасибо за понимание человек!!! Вы были действительно полезны! - person Joseph Freeman; 02.12.2015
comment
Np - почему вы отметили другой ответ как тот, который решил вашу проблему? - person j-u-s-t-i-n; 02.12.2015
comment
Что ж, его предложение было намного чище, чем то, что я делал, оно не было неправильным. Ваш ответ помог решить мои проблемы с декодированием. Поэтому я хотел, чтобы вы оба, ребята, получили признание за хорошие ответы и предложения :) - person Joseph Freeman; 03.12.2015