2016-10-17 3 views
0

Я пытаюсь расшифровать зашифрованную строку blowfish с Bouncycastle в C#.C# Bouncy Castle Blowfish Decryption - блок блокировки поврежден

Я могу легко зашифровать и расшифровать мою собственную строку, но, к сожалению, мне нужно расшифровать строку, созданную другой системой.

Я могу воссоздать эту же строку с C#/Bouncycastle, используя следующее, но мне еще не удалось его расшифровать.

using Org.BouncyCastle.Crypto.Engines; 
    using Org.BouncyCastle.Crypto.Paddings; 
    using Org.BouncyCastle.Crypto.Parameters; 

...

static readonly Encoding Encoding = Encoding.UTF8; 

    public string BlowfishEncrypt(string strValue, string key) 
    { 
     try 
     { 
      BlowfishEngine engine = new BlowfishEngine(); 

      PaddedBufferedBlockCipher cipher = new PaddedBufferedBlockCipher(engine); 

      KeyParameter keyBytes = new KeyParameter(Encoding.GetBytes(key)); 

      cipher.Init(true, keyBytes); 

      byte[] inB = Encoding.GetBytes(strValue); 

      byte[] outB = new byte[cipher.GetOutputSize(inB.Length)]; 

      int len1 = cipher.ProcessBytes(inB, 0, inB.Length, outB, 0); 

      cipher.DoFinal(outB, len1); 

      return BitConverter.ToString(outB).Replace("-", ""); 
     } 
     catch (Exception) 
     { 
      return ""; 
     } 
    } 

Ниже то, что у меня есть для дешифровки в данный момент. Строка, которая завершается с ошибкой «колодки блока поврежден» является cipher.DoFinal(out2, len2);

public string BlowfishDecrypt(string name, string keyString) 
    { 


     BlowfishEngine engine = new BlowfishEngine(); 
     PaddedBufferedBlockCipher cipher = new PaddedBufferedBlockCipher(engine); 

     StringBuilder result = new StringBuilder(); 

     cipher.Init(false, new KeyParameter(Encoding.GetBytes(keyString))); 

     byte[] out1 = Convert.FromBase64String(name); 
     byte[] out2 = new byte[cipher.GetOutputSize(out1.Length)]; 

     int len2 = cipher.ProcessBytes(out1, 0, out1.Length, out2, 0); 

     cipher.DoFinal(out2, len2); //Pad block corrupted error happens here 

     String s2 = BitConverter.ToString(out2); 

     for (int i = 0; i < s2.Length; i++) { 
      char c = s2[i]; 
      if (c != 0) { 
       result.Append(c.ToString()); 
      } 
     } 

     return result.ToString(); 

    } 

Любая идея, что я могу делать неправильно в BlowfishDecrypt()?

Примечание: Я преобразовал вышеуказанное (зашифровать и дешифровать) из примера Java bouncycastle, который я нашел где-то; шифрование работает. Единственное различие, которое я вижу, в том, что пример Java использует StringBuffer, где я использую StringBuilder.

+0

Я думаю, что 'name' в' BlowfishDecrypt' является закодированным зашифрованным текстом из 'BlowfishEncrypt'. Если это так, у вас есть несоответствие кодировки. Вы шифруете зашифрованный текст Hex во время шифрования, но пытаетесь его декодировать из Base64 во время дешифрования. Выберите одну кодировку и придерживайтесь ее. –

+0

Да, извините. Пример «name» будет результатом BlowfishEncrypt(). То, что вы говорите, имеет смысл, но я не совсем уверен, как его решить. Я изменил 'byte [] out1 = Convert.FromBase64String (name);' to 'byte [] out1 = Encoding.GetBytes (name);' но получить ту же ошибку. – p0laris

+0

Это был долгий день ... это должно было быть явно «Hex.Decode (name)». Благодарим за помощь! – p0laris

ответ

0

Спасибо, Artjom B!

byte[] out1 = Convert.FromBase64String(name); 

Должно быть

byte[] out1 = Hex.Decode(name); 

Оттуда, все, что я должен был сделать преобразовать Hex в строку.

 Смежные вопросы

  • Нет связанных вопросов^_^