2

Borland C ++で作成され、TurboPowerLockBoxコンポーネントに実装されたBlowfishアルゴリズムを使用したアプリケーションがあります。

このアプリケーションはC#に移植されました。現在、このアルゴリズムを使用するBorland C++dllを呼び出しています。ただし、64ビットOSでアプリケーションを実行すると、このdllを使用しようとするとエラーが発生します。アプリケーションを32ビットとしてコンパイルすると、すべてが機能しますが、このアプリケーションを64ビットアプリとして機能させたいと考えています。私が知る限り、それはC++のように機能する.NetBlowfishアルゴリズムが必要であることを意味します。

Blowfish.Netを見つけましたが、有望に見えます。ただし、同じキーとテキストを使用すると、暗号化された結果が一致しません。C++dllがBlowfishECBアルゴリズムを使用していることを知りました。また、結果をBase64に変換します。これも私が行いました。

これに関する助けをいただければ幸いです。これが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);
4

1 に答える 1

2

TurboPowerLockBoxデータとは互換性がありません。

C ++(32ビット)でLockBoxを使用してデコードし、一時ファイル/テーブルに出力し、Blowfish.NetとC#(64ビット)を使用して再エンコードすることにより、データ移行を行うユーティリティを提供することをお勧めします。

このデータ移行は、.NETバージョンにアップグレードする前に一度実行され、その後、すべて互換性があります。

フォーマットを変更しているので、バイナリファイル/ BLOBを保存することでフォーマットを変更してBase64変換を省略することもできます。複数の暗号化を適用したり、Blowfishを別のものに置き換えたりするなど、他のアイデアも役立つ場合があります。

于 2009-05-28T21:05:41.263 に答える