Как использовать blowfish в C++ в качестве внешней dll в C#

Кажется, в C# нет иглобрюха, который делал бы то же самое, что этот. Поэтому я решил использовать его как внешний, и если он снова не работает, то переведите всю иглобрюхую рыбу на С#. Но сначала попробую использовать как внешний.

Не могли бы вы взглянуть на Blowfish C++ и сказать мне, нужно ли мне изменить параметры функции (некоторые из них являются LPBYTE, которые не включены в C#).

Кроме того, я был бы признателен, если бы вы сказали мне, как использовать их в качестве внешней dll (у меня она уже скомпилирована как dll), но параметры функции в C++ меня расстраивают.

Изменить: мне нужно вызвать только Initialize, Encode и Decode.

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


person Ivan Prodanov    schedule 29.03.2009    source источник
comment
Что такое среда для C++? Можете ли вы скомпилировать его с поддержкой /CLR? Если это так, то довольно легко вызвать DLL C#. Единственная проблема заключается в том, что иногда вы сталкиваетесь с проблемами при компиляции с поддержкой CLR, поскольку некоторые ключи несовместимы.   -  person AaronLS    schedule 29.03.2009


Ответы (1)


У меня была аналогичная проблема в предыдущем проекте. Взглянув на код C++, он использует ECB, как вы и подозревали в предыдущем посте. Я думаю, что понимаю причину, по которой вы получаете разные результаты, используя Blowfish.NET (предложение Аркаина). Код C++ преобразует входные данные в два DWORD при шифровании. Я считаю, что Blowfish.NET будет поступать правильно, сохраняя порядок байтов в DWORD, который он использует для внутреннего шифрования.

Например: в коде C++ байты 0102030405060708 становятся 0x04030201 и 0x08070605. Реализация .NET станет 0x01020304 и 0x05060708.

person Dave Cluderay    schedule 29.03.2009
comment
@ Дэйв Кладерей, спасибо! Можете ли вы дать мне больше информации об устранении этой проблемы? Как исправить порядок байтов - person Ivan Prodanov; 29.03.2009
comment
@Dave, я был бы очень признателен, если бы вы могли взглянуть на то, что я сделал (проверьте //комментарии) pastebin.com /m2df92629 В конце концов, если я сделал что-то не так, пожалуйста, используйте pastebin.com, чтобы показать мне, как это должно быть сделано. Спасибо, Дэйв! - person Ivan Prodanov; 29.03.2009
comment
ОК - см. новые комментарии - я думаю, что все в порядке. - person Dave Cluderay; 29.03.2009
comment
@ Дэйв, это не работает. Я также пробовал передавать байты в обратном порядке. Тоже не работает. Вот что я делаю: зашифруйте массив на С# и попробуйте расшифровать его на С++. Ключ тот же. Любые другие предложения? :( - person Ivan Prodanov; 29.03.2009
comment
Я приношу свои извинения — код, который мы только что изменили, также вызывается во время инициализации, поэтому мы вызвали побочный эффект. - person Dave Cluderay; 29.03.2009
comment
Попробуйте изменить метод EncryptBlock, как показано здесь: pastebin.com/m6b4d8ff8 - person Dave Cluderay; 29.03.2009
comment
Ни один из них не работал. Я попробовал ваш способ. Затем я попробовал 0,1,2,3,7,6,5,4;3,2,1,0,4,5,6,7;7,6,5,4,1, 2,3. Ничего не вышло. Честно говоря, я пытался переписать этот проект в Delphi несколько месяцев назад, но не смог закончить из-за той же проблемы - иглобрюха. Я не хочу снова потерпеть неудачу. Пожалуйста, помогите, Дэйв! - person Ivan Prodanov; 29.03.2009
comment
Я создал еще один поток. Теперь в нем намного больше кода, должно быть проще, но становится еще хуже. stackoverflow.com/ вопросы/695419/ - person Ivan Prodanov; 30.03.2009