Проблема «где-то» во всем этом коде обработки потока в вашем методе расшифровки.Я говорю это, потому что я не собираюсь копаться и искать точную ошибку.Первое, что выскочило, это то, что ваши методы шифрования и дешифрования не выглядят «симметрично» - они выполняют примерно одинаковые действия (но некоторые операции меняются местами).Обычно это плохой знак с парами методов шифрования / дешифрования 1 .
Так что если я делаю дешифрование похожим на шифрование и не выполняю всю работу по обработке потоков:
private static byte[] DecryptBytesFromBytes(byte[] cipherText, byte[] Key, byte[] IV)
{
if ((cipherText == null) || (cipherText.Length <= 0))
{
throw (new ArgumentNullException("cipherText"));
}
if ((Key == null) || (Key.Length <= 0))
{
throw (new ArgumentNullException("Key"));
}
RijndaelManaged rijAlg = new RijndaelManaged();
rijAlg.Key = Key;
if (!(IV == null))
{
if (IV.Length > 0)
{
rijAlg.IV = IV;
}
else
{
rijAlg.Mode = CipherMode.ECB;
}
}
else
{
rijAlg.Mode = CipherMode.ECB;
}
ICryptoTransform decryptor = rijAlg.CreateDecryptor(rijAlg.Key, rijAlg.IV);
return decryptor.TransformFinalBlock(cipherText, 0, cipherText.Length);
}
(я также пропустил наличие переменной output
- я не видел необходимости в этом, и комментарии просто рассказывали нам , что делает код, который мы можем определить, прочитавкод).
Теперь это (в сочетании с EncryptBytesToBytes
в вашем вопросе) может успешно выполнить обход данных примера:
static void Main()
{
var inp = new byte[] { 0x25, 0x50, 0x44, 0x46, 0x2D, 0x31, 0x2E, 0x35,
0x0D, 0x25, 0xE2, 0xE3, 0xCF, 0xD3, 0x0D, 0x0A };
var key = "ayb&e#i&BWLGMe2V";
var oup = AES_DecryptBytes(AES_EncryptBytes(inp, key), key);
Console.ReadLine();
}
На глаз, inp
и oup
содержат те же данные.
(вставьте обычные предостережения о том, что ЕЦБ является ужасным режимом, если только он не выбран по очень особым причинам)
1 Моя обычная рекомендация, если вы собираетесь создать пару методов шифрования / дешифрования, это сделать медленно и просто и убедиться, что пара может округляться-подходите на каждом этапе, прежде чем добавлять больше сложности.
Первый этапЭто просто "возвращает входной буфер, игнорирует ключ и IV".Напишите несколько модульных тестов, которые подтверждают его циклические переходы с некоторыми буферами приличного размера и определенным ключом и IV.
Затем добавьте немного больше сложности к реализации и убедитесь, что модульные тесты по-прежнемупроходите и выполняйте итерацию до тех пор, пока методы не сделают то, что вы хотите / нуждаетесь в них.
Если вам нужно «зашифровать на одном языке, расшифровать на другом», я бы фактически рекомендовал делать все это дважды, воба языка, так что они оба имеют оба набора методов.Затем убедитесь, что выходы на каждом этапе соответствуют между вашими реализациями.