У меня есть приложение, которое изначально было написано на Borland C ++ и использовало алгоритм Blowfish, реализованный в компоненте TurboPower LockBox.
Это приложение было портировано на C #. В настоящее время я вызываю библиотеку Borland C ++, которая использует этот алгоритм. Тем не менее, при запуске приложения в 64-битной ОС, я получаю ошибки всякий раз, когда пытаюсь использовать эту DLL. Если я скомпилирую приложение как 32-битное, все будет работать, но мы хотим, чтобы это приложение работало как 64-битное приложение. Насколько я могу судить, это означает, что мне нужен .Net Blowfish алгоритм, который работает как C ++.
Я нашел Blowfish.Net, и это выглядит многообещающе. Однако, когда я использую тот же ключ и текст, зашифрованные результаты не совпадают. Я узнал, что C ++ dll использует алгоритм BlowfishECB. Он также преобразует результат в Base 64, что я тоже сделал.
Любая помощь с этим будет оценена. Вот некоторый тестовый код в C #.
//Convert the key to a byte array. In C++ the key was 16 bytes long
byte[] _key = new byte[16];
Array.Clear(_key, 0, _key.Length);
var pwdBytes = System.Text.Encoding.Default.GetBytes(LicEncryptKey);
int max = Math.Min(16, pwdBytes.Length);
Array.Copy(pwdBytes, _key, max);
//Convert the string to a byte[] and pad it to to the 8 byte block size
var decrypted = System.Text.Encoding.ASCII.GetBytes(originalString);
var blowfish = new BlowfishECB();
blowfish.Initialize(_key, 0, _key.Length);
int arraySize = decrypted.Length;
int diff = arraySize%BlowfishECB.BLOCK_SIZE;
if (diff != 0)
{
arraySize += (BlowfishECB.BLOCK_SIZE - diff);
}
var decryptedBytes = new Byte[arraySize];
Array.Clear(decryptedBytes, 0, decryptedBytes.Length);
Array.Copy(decrypted, decryptedBytes, decrypted.Length);
//Prepare the byte array for the encrypted string
var encryptedBytes = new Byte[decryptedBytes.Length];
Array.Clear(encryptedBytes, 0, encryptedBytes.Length);
blowfish.Encrypt(decryptedBytes, 0, encryptedBytes, 0, decryptedBytes.Length);
//Convert to Base64
string result = Convert.ToBase64String(encryptedBytes);