Шифрование и дешифрование данных с использованием Blowfish с Coldfusion и .NET / BouncyCastle - PullRequest
0 голосов
/ 24 января 2019

Я пытаюсь имитировать шифрование Blowfish / Hex Coldfusion, используя BouncyCastle для ASP.NET MVC. Мне удалось успешно расшифровать строку, зашифрованную в CF, используя шаги, изложенные в этой ссылке: Шифрование и дешифрование данных с использованием Blowfish / CBC / PKCS5Padding

Кроме добавления \ 0 в конец строки из 7 символов, он отлично работает.

Я не пытаюсь использовать Blowfish / CBC / PKCS5Padding, только Blowfish / Hex. Я не могу заставить работать реверс (шифрование). Ниже приведен код, который у меня есть до сих пор

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

Расшифровка (работает):

string keyString = "TEST";
BlowfishEngine engine = new BlowfishEngine();
PaddedBufferedBlockCipher cipher = new PaddedBufferedBlockCipher(engine);
cipher.Init(false, new KeyParameter(Convert.FromBase64String(keyString)));
byte[] out1 = Hex.Decode(hexstring);
byte[] out2 = new byte[cipher.GetOutputSize(out1.Length)];
int len2 = cipher.ProcessBytes(out1, 0, out1.Length, out2, 0);
cipher.DoFinal(out2, len2);
string myval = Encoding.UTF8.GetString(out2);

Шифрование (не работает):

string keyString = "TEST";
string stringToEncrypt = "0123456";
stringToEncrypt = stringToEncrypt + "=";
BlowfishEngine engine2 = new BlowfishEngine();
PaddedBufferedBlockCipher cipher2 = new PaddedBufferedBlockCipher(engine2);
cipher2.Init(true, new KeyParameter(Convert.FromBase64String(keyString)));
byte[] inB = Hex.Encode(Convert.FromBase64String(stringToEncrypt));
byte[] outB = new byte[cipher2.GetOutputSize(inB.Length)];
int len1 = cipher2.ProcessBytes(inB, 0, inB.Length, outB, 0);
cipher2.DoFinal(outB, len1);
var myval2 = BitConverter.ToString(outB).Replace("-", "");

Значение «Не работает» - возвращает зашифрованную строку, которая никоим образом не отражает строку, зашифрованную CF. Кроме того, возвращаемая строка, если она расшифрована с использованием вышеуказанного метода, не совпадает с той, которая была первоначально введена (с использованием шифрования .NET / BouncyCastle)

1 Ответ

0 голосов
/ 25 января 2019

Код C # декодирует входные данные как base64, когда это на самом деле просто текст.Таким образом, вы шифруете неправильное значение.Вот почему результат не совпадает с зашифрованной строкой из CF.Поскольку CF всегда использует UTF8, используйте это:

byte[] inB = Encoding.UTF8.GetBytes(stringToEncrypt);

Вместо:

byte[] inB = Hex.Encode(Convert.FromBase64String(stringToEncrypt));

Дополнительные советы по безопасности:

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

  2. Для тех, кто читает эту ветку в будущем, очевидно, значение ключа "TEST" просто для иллюстрации. Не используйте произвольные значения в качестве ключей , так как это ослабляет безопасность.Всегда используйте сильные ключи, сгенерированные стандартной криптографической библиотекой.Например, в CF используйте функцию GenerateSecretKey .

...