Портирование TurboPower Blowfish на.Net
У меня есть приложение, которое было изначально написано на 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);
1 ответ
Он не совместим с вашими данными TurboPower LockBox.
Я бы посоветовал вам предоставить утилиту для переноса данных путем декодирования с использованием LockBox в C++ (32-битная версия), вывода во временные файлы / таблицы и перекодирования с использованием Blowfish.Net и C# (64-битная версия).
Эта миграция данных выполняется один раз перед любым обновлением до версии.NET, тогда она полностью совместима с ней.
Поскольку вы меняете формат: вы также можете изменить формат и опустить преобразование Base64, храня двоичные файлы / большие двоичные объекты, другие идеи также могут быть полезны, например, применение нескольких шифрований или замена Blowfish чем-то другим.