Я пытаюсь расшифровать зашифрованную строку 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.
Я думаю, что 'name' в' BlowfishDecrypt' является закодированным зашифрованным текстом из 'BlowfishEncrypt'. Если это так, у вас есть несоответствие кодировки. Вы шифруете зашифрованный текст Hex во время шифрования, но пытаетесь его декодировать из Base64 во время дешифрования. Выберите одну кодировку и придерживайтесь ее. –
Да, извините. Пример «name» будет результатом BlowfishEncrypt(). То, что вы говорите, имеет смысл, но я не совсем уверен, как его решить. Я изменил 'byte [] out1 = Convert.FromBase64String (name);' to 'byte [] out1 = Encoding.GetBytes (name);' но получить ту же ошибку. – p0laris
Это был долгий день ... это должно было быть явно «Hex.Decode (name)». Благодарим за помощь! – p0laris