C ++ blowfish работает с меньшим количеством букв, но C # blowfish не - PullRequest
0 голосов
/ 01 апреля 2009

C ++ blowfish поддерживает шифрование блока, содержащего менее <8 букв, тогда как .NET - нет. Почему? </p>

-> C # NET Blowfish <- </a> -> C ++ Blowfish <- </a>

В приложениях C ++ и C # я шифрую следующий массив

    byte response[6] = 
    {
        0x00, 0x80, 0x01, 0x61, 0x05, 0x06
    };

В приложениях C ++ и C # я вызываю функцию Encrypt с одинаковыми параметрами.

C++
Blowfish.Encrypt((LPBYTE)responce + 2,(LPBYTE)responce + 2, 4);

C#
Blowfish.Encrypt(responce, 2, responce, 2, responce.Length - 2);

Однако в C ++ данные зашифрованы, но не в C #.

Строки 45,47 и 49 в C # NET Blowfish - проблемные строки, после вычисления в строке 45 - результат становится равным 0. Строка 47 становится 2 + 0 = 2, а строка 49 2 не меньше 2, так что петли нет.

В C ++ blowfish есть некоторые отступы, но я теряюсь, когда пытаюсь это понять.

Моя проблема в том, что в C # заполнение должно быть точно таким же, как и в C ++, поэтому я получаю правильный ответ. Я не могу использовать случайное заполнение и затем удалять бесполезные байты после расшифровки, , потому что сервер Я отправляю зашифрованный массив не мой.

Не могли бы вы указать, какие отступы используются в blowfish C ++ и как они должны быть реализованы в C # NET.

// Примечание. Мне не нужно отправлять этот пакет несколько раз, только один раз.

Заранее спасибо!

1 Ответ

2 голосов
/ 01 апреля 2009

Код, который вы вставили (кстати, не рекомендуется для SO, так как ваша вставка будет удалена, если никто не читает ее через некоторое время, тем самым оставляя этот вопрос неработающим), в комментарии к заголовку говорится:

/// Note that the number of bytes must be adjusted to the block size of the algorithm.

(строки 3 и 4). Так что, похоже, он ведёт себя к спецификации, если игнорирует ваши недооцененные данные.

Код C ++, кажется, заполнен нулевыми байтами, комментарий гласит:

// pad end of data with null bytes to complete encryption

Было бы полезно увидеть функцию C ++ GetOutputLength(), чтобы увидеть, как она обрабатывает вводы меньшего размера. Я предполагаю, что это округляется вверх, но было бы хорошо проверить.

...