Как расшифровать шестнадцатеричную строку с помощью Blowfish в С#?

Итак, мне дали задание доказать, что можно расшифровать строку, представленную в шестнадцатеричных байтах, которая была зашифрована с помощью Blowfish с помощью C#.

Вот что есть:

  • Зашифрованная строка, представленная в шестнадцатеричных байтах.
  • Ключ шифрования в виде строки.

Возможно, я немного наивен, но я думал, что этот процесс будет простым.

то есть возьмите реализацию Blowfish из сети, а затем просто подключите ключ шифрования и зашифрованный текст, и он выведет строку в читаемом формате.

К сожалению, похоже, это не так. За последние несколько часов я попробовал несколько разных библиотек, но остановился на BouncyCastle, так как он кажется самым популярным. Однако документации не так много (отмечено в других вопросах здесь и на других сайтах), и я действительно не знаю, как это сделать.

Вот что у меня есть:

using Org.BouncyCastle.Crypto.Engines;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Utilities.Encoders;
using Org.BouncyCastle.Crypto;


public class CryptTest
{
    public void Decrypt()
    {           
        var engine = new BlowfishEngine();
        var param = new KeyParameter(System.Text.Encoding.ASCII.GetBytes("sdjerwioukjiefdjewiujewiunjeuwer"));
        var input = Hex.Decode("db247cceae61fddbcbb62d00281e0446");

        BufferedBlockCipher cipher = new BufferedBlockCipher(engine);

        cipher.Init(false, param);

        byte[] outBytes = new byte[input.Length];

        int len1 = cipher.ProcessBytes(input, 0, input.Length, outBytes, 0);

        cipher.DoFinal(outBytes, len1);

        Console.WriteLine(System.Text.Encoding.ASCII.GetString(outBytes));
    }

}

Я попытался адаптировать это из класса Test, который поставляется с BouncyCastle. Может ли кто-нибудь указать мне хороший пример, который делает то, что я хочу сделать?

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

ОБНОВИТЬ:

Я также попробовал другую библиотеку из здесь, потому что она выглядит ближе к тому, что я хочу делать.

i.e.

BlowFish b = new BlowFish(System.Text.Encoding.ASCII.GetBytes("sdjerwioukjiefdjewiujewiunjeuwer"));

var result1 = b.Decrypt_CBC("db247cceae61fddbcbb62d00281e0446");
var result2 = b.Decrypt_ECB("db247cceae61fddbcbb62d00281e0446");

Console.WriteLine(result1 + "\n" + result2);

Но я все еще получаю тарабарщину вернулся.

ОБНОВЛЕНИЕ 2:

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


person Adam Jones    schedule 05.09.2014    source источник
comment
Какая у вас проблема?   -  person SLaks    schedule 05.09.2014
comment
По сути, это не расшифровка строки, и я не знаю, с чего начать, чтобы понять, почему.   -  person Adam Jones    schedule 05.09.2014
comment
Итак, что происходит? Он взрывается?   -  person SLaks    schedule 05.09.2014
comment
Нет, он просто выводит что-то нечитаемое.   -  person Adam Jones    schedule 05.09.2014
comment
Тогда что-то не совпадает между вашим шифрованием и вашим дешифрованием. Проверьте свой IV.   -  person SLaks    schedule 05.09.2014
comment
Сделаю. Каждый пример кода, который я видел, имеет ключ в виде шестнадцатеричной строки, а ключ, который мне дали, — нет.   -  person Adam Jones    schedule 05.09.2014


Ответы (1)


Вы игнорируете расшифровку первого фрагмента (из ProcessBytes()).

Вместо прямого использования шифровальных объектов следует использовать CryptoStream:

using (var reader = new StreamReader(new CryptoStream(new MemoryStream(input), cipher, CrytoStreamMode.Read))
    Console.WriteLine(reader.ReadToEnd());

BouncyCastle не реализует ICryptoTransform, поэтому вам нужно самостоятельно конкатенировать результат каждого вызова.

person SLaks    schedule 05.09.2014