Как расшифровать зашифрованный текст Rijndael 128

Я пытаюсь расшифровать зашифрованный шифр Rijndael-128, вот значения:

Cipher: "QfJzZ9V6Jm43jYPiVaXP9mu+f88S/JC24saHbOMxxC8="
Key: "45744855535472525844494538555934",
Mode: CBC

Result should be: "abcd@1234"

Этот сайт отлично расшифровывает шифр: https://codebeautify.org/encrypt-decrypt

Я пытаюсь сделать то же самое на С#, но безуспешно, что мне здесь не хватает?

class Program
{
    static void Main(string[] args)
    {
        var text = Decrypt("QfJzZ9V6Jm43jYPiVaXP9mu+f88S/JC24saHbOMxxC8=", Convert.FromBase64String("45744855535472525844494538555934"));
    }

    public static string Decrypt(string Text, byte[] keyBytes)
    {
        var textBytes = Convert.FromBase64String(Text);

        var rijKey = new RijndaelManaged();

        rijKey.IV = textBytes.Take(rijKey.BlockSize / 8).ToArray(); 

        rijKey.Padding = PaddingMode.None;

        rijKey.Mode = CipherMode.CBC;

        var  decryptor = rijKey.CreateDecryptor(keyBytes, rijKey.IV);

        var memoryStream = new MemoryStream(textBytes);

        var cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read);

        var pTextBytes = new byte[textBytes.Length];

        var decryptedByteCount = cryptoStream.Read(pTextBytes, 0, pTextBytes.Length);

        memoryStream.Close();

        cryptoStream.Close();

        string plainText = Encoding.UTF8.GetString(pTextBytes, 0, decryptedByteCount);

        return plainText;
    }
}

person MahmoudMh    schedule 23.11.2020    source источник
comment
Можете ли вы уточнить, какова ваша конечная цель здесь? Это для расшифровки зашифрованных данных Rijndael? Если да, возможно, было бы полезнее взглянуть на источник этих данных, на то, как они приходят к этим вещам. Если ваша цель — расшифровать данные, зашифрованные этим веб-сайтом, я уверен, что вам нужно знать, как этот веб-сайт делает это.   -  person Lasse V. Karlsen    schedule 23.11.2020
comment
моя конечная цель - узнать, как расшифровать эту строку, у меня есть еще много строк, которые мне нужно расшифровать, и у меня есть только шифр и ключ, я хочу знать, как этот веб-сайт делает это без iv (или как он извлекает его ) и воспроизвести это в моем коде, чтобы я мог расшифровать все значения. количество значений огромно (сотни тысяч), поэтому я не могу использовать веб-сайт для их расшифровки по одному.   -  person MahmoudMh    schedule 24.11.2020


Ответы (1)


Проблема с вашим кодом заключается в этой строке:

rijKey.GenerateIV();

Вам нужен оригинальный IV. Вы не можете просто использовать случайный.

Если вы переходите на сайт, на который вы ссылаетесь, каждый раз, когда вы нажимаете шифрование с помощью указанного вами ключа и текста, вы получаете другой зашифрованный текст (поскольку используется случайный IV). Веб-страница должна добавлять случайный IV, используемый для шифрования, к зашифрованному тексту (или, что менее вероятно, веб-страница хранит его), поэтому она может затем расшифровать зашифрованный текст.

[Ваш код также нуждается в using операторах.]

Можно ли НЕ использовать IV при реализации расшифровки Rijndael?

Как использовать Rijndael ManagedEncryption с C#

person Mitch Wheat    schedule 23.11.2020
comment
Тем не менее, он может расшифровать ввод, указанный в вопросе, поэтому ясно, что должен быть способ получить правильный IV, по крайней мере, для этого конкретного примера. Я попробовал 16-байтовый 0-массив, но это было не то. - person Lasse V. Karlsen; 23.11.2020
comment
@LasseV.Karlsen: я считаю, что IV либо добавляется к зашифрованному тексту, либо добавляется к нему, но, поскольку OP, похоже, не присутствует, я больше не прилагал усилий. - person Mitch Wheat; 23.11.2020
comment
Я попытался просто взять первые 16 байтов из textBytes в качестве IV, но это также приводит к повреждению вывода, так что, по крайней мере, это не так просто. Я думаю, что OP не узнает, поэтому я думаю, что настоящий вопрос в том, как этот сайт это делает. IV также не является последними 16 байтами. - person Lasse V. Karlsen; 23.11.2020
comment
и я только что проверил; На 99,9% уверен, что IV присутствует в зашифрованном тексте. Я зашифровал abcd@1234 с помощью ключа OP, закрыл веб-сайт, снова открыл веб-сайт, ввел зашифрованный текст и ключ, и он отлично расшифровался. - person Mitch Wheat; 23.11.2020
comment
Я пробовал rijKey.IV = textBytes.Take(rijKey.BlockSize / 8).ToArray(); textBytes = textBytes.Skip(rijKey.BlockSize / 8).ToArray(); - person Lasse V. Karlsen; 23.11.2020
comment
@LasseV.Karlsen да, это то, что меня смущает, веб-сайт, кажется, отлично его расшифровывает, поэтому я почти уверен, что iv находится где-то в зашифрованном тексте, вопрос в том, где? Я попытался также взять первые 16 байтов и последние 16 байтов как IV, и это все равно не вернуло мне ожидаемый результат. - person MahmoudMh; 23.11.2020
comment
@MitchWheat: для меня это выглядит как прямой CBC с первыми 16 байтами в качестве IV. Однако веб-сайт использует нулевое заполнение (байты 0x00) для последнего блока. И, конечно же, вывод закодирован в base64. - person President James K. Polk; 23.11.2020
comment
@MahmoudMh: так что я почти уверен, что iv находится где-то в зашифрованном тексте, и все же ваш фрагмент кода не пытается получить IV, вместо этого генерирует случайный IV. - person Mitch Wheat; 24.11.2020
comment
@MahmoudMh: изменение существующего кода несколько не одобряется, так как оно делает существующие ответы недействительными. - person Mitch Wheat; 24.11.2020