4

OK-- Mikeのおかげで、Wincrypt に Diffie-Hellman 鍵ペアを生成させることができました。公開鍵をエクスポートする方法と、相手の公開鍵をインポートする方法を見つけました。ドキュメントによると、相手の公開鍵をインポートすると、共有秘密が計算されます。偉大な。

私は今、その共有された秘密を手に入れる必要がありますが、それは不可能だと思います. アルゴリズム IDを何かに変更するために呼び出さない限り、単純CryptExportKeyにタイプで呼び出してもPLAINTEXTKEYBLOB失敗します。しかし、私は他の何かが欲しいのではなく、共有された秘密が欲しい. ただし、API はこれを思いとどまらせるように設計されているようです。CryptSetKeyParamCALG_AGREEDKEY_ANY

そこに何かアイデアはありますか?ここでの問題は、WiFi Protected Setup の実装の片面しか書いていないことです。したがって、プロトコルは私のために定義されており、相手は私に HCRYPTKEY を与えていません。

4

1 に答える 1

2

これはあなたが必要とするもののように見えます... から: http://msdn.microsoft.com/en-us/library/aa381969(VS.85).aspx


Diffie-Hellman 公開鍵をインポートして秘密セッション鍵を計算するには

  1. 関数を呼び出してCryptAcquireContext、Microsoft Diffie-Hellman 暗号化プロバイダーへのハンドルを取得します。
  2. CryptGenKey関数を呼び出して新しいキーを作成するか、CryptGetUserKey関数を呼び出して既存のキーを取得することにより、Diffie-Hellman キーを作成します。
  3. Diffie-Hellman 公開キーを CSP にインポートするには、CryptImportKey関数を呼び出して、パラメーターで公開キー BLOB へのポインター、pbDataパラメーターで BLOB の長さdwDataLen、およびパラメーターで Diffie-Hellman キーへのハンドルを渡しhPubKeyます。これにより、計算(Y^X) mod Pが実行され、共有秘密鍵が作成され、鍵交換が完了します。この関数呼び出しは、パラメーター内の新しい秘密のセッション キーへのハンドルを返しhKeyます。
  4. この時点で、インポートされた Diffie-Hellman のタイプはCALG_AGREEDKEY_ANYです。キーを使用する前に、セッション キー タイプに変換する必要があります。これは、 set toおよびset toなどのセッション キーを表す値へのポインターを使用してCryptSetKeyParam関数を呼び出すことによって実現されます。または関数で共有キーを使用する前に、キーを変換する必要があります。キーの種類を変換する前にこれらの関数のいずれかを呼び出すと、失敗します。dwParamKP_ALGIDpbDataALG_IDCALG_RC4CryptEncryptCryptDecrypt
  5. これで、秘密のセッション キーを暗号化または復号化に使用する準備が整いました。
  6. キーが不要になったら、CryptDestroyKey関数を呼び出してキー ハンドルを破棄します。
于 2008-09-18T23:45:49.953 に答える