0

3DES 暗号化/暗号化を行う C# アセンブリを作成し、テストしました。インストールのために、リモート マシンでデータを復号化する必要があります。ネイティブ プロセスの実行時に .NET が存在するとは限らないため、Win32 C++ メソッドを使用して暗号化を解除する必要があります。これは商用アプリケーション向けであるため、サードパーティのライブラリはライセンスに柔軟に対応する必要があります。簡単な例から始めたいと思います。これまでに見つけたほとんどの例では、セッション キーをインポートする必要があります。私はそれらを使用していません。マシン A で .NET 2.0 を使用して暗号化し、マシン B に渡します。そこでキーを取得し、ネイティブの Win32 API で復号化します。誰かがいくつかの例で私を正しい方向に向けることができますか?

から始める必要があることはわかっていCryptAcquireContext(&hProv, NULL, MS_ENHANCED_PROV, PROV_RSA_FULL, CRYPT_VERIFY_CONTEXT)ます。ただし、次のステップはキーのインポートのようで、必要なようです ( http://support.microsoft.com/kb/228786 )。これは正しいですか、それとも私がこれを難しくしすぎていますか。暗号化の基本的な理解があります。前もって感謝します!

4

1 に答える 1

2

次のコードを見てください。

#define TRIPLEDES_KEYSIZE 24
#define TRIPLEDES_BLOCKSIZE 8

...

BYTE key[TRIPLEDES_KEYSIZE] = { ... };

...

HCRYPTKEY hKey;

typedef struct
{
    BLOBHEADER hdr;
    DWORD cbKeySize;
    BYTE rgbKeyData [TRIPLEDES_KEYSIZE];
} KEYBLOB;

KEYBLOB keyBlob;
memset(&keyBlob, 0, sizeof(keyBlob));
keyBlob.cbKeySize = TRIPLEDES_KEYSIZE;
keyBlob.hdr.bType = PLAINTEXTKEYBLOB;
keyBlob.hdr.bVersion = CUR_BLOB_VERSION;
keyBlob.hdr.aiKeyAlg = CALG_3DES;
memcpy(keyBlob.rgbKeyData, key, TRIPLEDES_KEYSIZE);

BOOL res = CryptImportKey(hCryptProv, (const BYTE*)&keyBlob, sizeof(keyBlob), 0, 0, &hKey);
if (res)
{
    res = CryptSetKeyParam(hKey, KP_MODE, CRYPT_MODE_ECB, 0);

やりたいことに応じて、オプション付きの関数の呼び出しでCRYPT_MODE_ECBorを使用できることに注意してください。たとえば、次のコードで IV を設定できます。CRYPT_MODE_CBCCryptSetKeyParamKP_MODE

res = CryptSetKeyParam(hKey, KP_IV, iv, 0);

CRYPT_MODE_CBCこれは、 like モードでのみ意味があります。

CALG_3DES_112112 ビット キーのみ (つまり、2 つの通常の DES キー) で動作する別の 3DES モード ( ) もあることに注意してください。このモードを使用する場合は、コードを変更する必要があります。

編集:

CryptoApi のすべてを管理するには、C++ でいくつかのクラスを作成する必要があります。それはあなたの頭痛を大幅に軽減します。

于 2012-12-03T07:52:46.370 に答える