Portieren Turbopower Blowfish zu .Net
-
06-09-2019 - |
Frage
Ich habe eine Anwendung, die ursprünglich in Borland C ++ geschrieben wurde, und verwendet, um einen Blowfish-Algorithmus in der Komponente Turbopower LockBox umgesetzt.
Diese Anwendung wird nun auf C # portiert. Ich nenne derzeit eine Borland C ++ DLL, die diesen Algorithmus verwendet. Wenn jedoch die Anwendung auf einem 64-Bit-Betriebssystem ausgeführt wird, bekomme ich Fehler, wenn Sie versuchen, diese DLL zu verwenden. Wenn ich kompilieren die Anwendung als 32-bit, alles funktioniert, aber wir wollen diese Anwendung Arbeit als App 64-Bit haben. Soweit ich das beurteilen kann, das bedeutet, dass ich einen .Net Blowfish-Algorithmus benötigen, die wie die C ++ gearbeitet.
Ich fand Blowfish.Net und es sieht vielversprechend aus. Allerdings, wenn ich den gleichen Schlüssel und Text, um das verschlüsselte Ergebnis zu erzielen, stimmt nicht überein. Ich habe die C herauszufinden ++ DLL verwendet die BlowfishECB Algorithmus. Es wandelt auch das Ergebnis zu Base 64, die ich auch getan haben.
Jede Hilfe bei diesem würde geschätzt. Hier finden Sie einige Test-Code in 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);
Lösung
Es wird nicht mit Turbopower LockBox Daten kompatibel.
Ich würde vorschlagen, dass Sie ein Dienstprogramm zur Verfügung stellen durch Dekodieren mit LockBox in C, um die Datenmigration zu tun ++ (32-Bit), die Ausgabe zu temporären Dateien / Tabellen und Re-Encoding mit Blowfish.Net und C # (64-Bit) .
Diese Datenmigration einmal vor jedem Upgrade auf die .NET-Version fertig ist, dann ist es kompatibel mit ihm.
Da Sie das Format sind zu ändern: Sie können auch das Format ändern und die Base64 Umwandlung auslassen durch das Speichern von Binärdateien / BLOBs können andere Ideen auch nützlich sein wie mehrere Verschlüsselungen Anwendung, oder Blowfish durch etwas zu ersetzen.