Шифрование Blowfish ECB в реализации C#

У меня есть клиент, которому нужно, чтобы мы использовали шифрование Blowfish ECB с cipherMode 0, выход 1. Я пытался решить эту проблему, но я застрял. Как исправить мой код?

Вот полные инструкции для клиента:

Алгоритм:Blowfish ・ Mode: ECB ・ Padding: PKCS5Padding *Исходный вектор не нужен, так как мы используем режим ECB.

<Сильный> Пример · · Шиферный ключ: 2fs5uhnjcnpxcpg9 → простой текст: 3280: 99: 20120201123050 → Шифрский текст: DAA745F1901364C0BD42B9658DB3B96336758CD34B2A576 * Пожалуйста, держите зашифруйте текст с 16 шестнадцатеричными символами. * Пожалуйста, сгенерируйте зашифрованный текст без «соли».

Мне нужно написать это на C#. Вот что я сделал, но, похоже, это не работает:

string member_id = "3280";
        string panelType = "99";
        string RandomString = "20120201123050";
        string encryptionKey = "2fs5uhnjcnpxcpg9";
        string cryptstr = member_id + ":" + panelType + ":" + RandomString;
        string plainText = cryptstr;
        BlowFish b = new BlowFish(encryptionKey);
        string cipherText = b.Encrypt_ECB("3280:99:20120201123050");

Результат не daa745f1901364c0bd42b9658db3db96336758cd34b2a576. Где я ошибся?


person Alex Leger    schedule 13.04.2017    source источник
comment
Ничего себе, это о худшем с точки зрения безопасности! Даже автор Blowfish его больше не использует, теперь он использует AES. Не используйте режим ECB, это небезопасно, см. режим ECB, прокрутите вниз до пингвина.   -  person zaph    schedule 13.04.2017
comment
Что вы импортируете, чтобы получить класс Blowfish? И поскольку я не вижу, чтобы вы что-то устанавливали для заполнения, какое значение по умолчанию использует документ для библиотеки, содержащей этот класс Blowfish?   -  person Richard Schwartz    schedule 13.04.2017
comment
В конце концов пришло время обновить безопасность, AES существует уже 15 лет, клиент действительно должен приложить усилия, ждать еще 15 лет было бы смешно.   -  person zaph    schedule 13.04.2017


Ответы (1)


Encrypt_ECB() поэтому я предполагаю, что это класс Шнайера.

ctor ожидает шестнадцатеричную строку, если она передана, вам нужна перегрузка для массива байтов:

BlowFish b = new BlowFish(Encoding.UTF8.GetBytes(encryptionKey));

Вывод по-прежнему неверен, давайте посмотрим, каким он должен быть на самом деле, расшифровав их пример:

string clear = b.Decrypt_ECB("daa745f1901364c0bd42b9658db3db96336758cd34b2a576");

дает нам:

"3280:99:20120201123050\u0002\u0002"

Это хорошо, но в конце есть 2 0x2 байта, N x 0xN из-за заполнения PKCS. Чтобы получить совпадение, вам нужно дополнить ввод:

// input to bytes
List<byte> clearBytes = new List<byte>(Encoding.UTF8.GetBytes("3280:99:20120201123050"));

// how many padding bytes?
int needPaddingBytes = 8 - (clearBytes.Count % 8);

// add them
clearBytes.AddRange(Enumerable.Repeat((byte)needPaddingBytes, needPaddingBytes));

// encrypt
byte[] cipherText = b.Encrypt_ECB(clearBytes.ToArray());

// to hex
string cipherTextHex = BitConverter.ToString(cipherText).Replace("-", "").ToLowerInvariant();
person Alex K.    schedule 13.04.2017
comment
Класс можно загрузить с: schneier.com/code/blowfish.cs - person MundoPeter; 01.09.2020