Портирование TurboPower Blowfish на .Net - PullRequest
2 голосов
/ 28 мая 2009

У меня есть приложение, которое изначально было написано на 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 Ответ

2 голосов
/ 29 мая 2009

Он не совместим с вашими данными TurboPower LockBox.

Я бы посоветовал вам предоставить утилиту для переноса данных путем декодирования с использованием LockBox в C ++ (32-битная версия), вывода во временные файлы / таблицы и перекодирования с использованием Blowfish.Net и C # (64-битная версия) .

Эта миграция данных выполняется один раз перед любым обновлением до версии .NET, тогда она полностью совместима с ней.

Поскольку вы меняете формат: вы также можете изменить формат и пропустить преобразование Base64, храня двоичные файлы / большие двоичные объекты, другие идеи также могут быть полезны, например, применение нескольких шифрований или замена Blowfish чем-то другим.

...