P&G を持っています。Wincrypt API を使用して Diffie-Hellman キーペアを生成するにはどうすればよいですか?
-
09-06-2019 - |
質問
MSDN の記事があります ここ, 、しかし、私はそれほど遠くには進んでいません:
p = 139;
g = 5;
CRYPT_DATA_BLOB pblob;
pblob.cbData = sizeof( ULONG );
pblob.pbData = ( LPBYTE ) &p;
CRYPT_DATA_BLOB gblob;
gblob.cbData = sizeof( ULONG );
gblob.pbData = ( LPBYTE ) &g;
HCRYPTKEY hKey;
if ( ::CryptGenKey( m_hCryptoProvider, CALG_DH_SF,
CRYPT_PREGEN, &hKey ) )
{
::CryptSetKeyParam( hKey, KP_P, ( LPBYTE ) &pblob, 0 );
ここで失敗します NTE_BAD_DATA
. 。使っています MS_DEF_DSS_DH_PROV
. 。何が与えますか?
解決
使用している非常に短いキーが気に入らないだけかもしれません。
見つけました その記事のデスクトップ版 完全な例があるので役立つかもしれません。
編集:
OP は、この例から、鍵の長さを CryptGenKey に伝える必要があることに気付きました。これを行うには、フラグの上位 16 ビットを使用するビット数に設定します。これを 0 のままにすると、デフォルトのキーの長さが取得されます。これ は に文書化されている 備考 デバイスのドキュメントのセクションと、 dwFlags のパラメータ デスクトップドキュメント.
Windows XP 以降では、Diffie-Hellman キー交換アルゴリズムの場合、基本プロバイダーはデフォルトで 512 ビット キーに設定され、拡張プロバイダー (デフォルト) はデフォルトで 1024 ビット キーに設定されます。CE のデフォルトの長さに関するドキュメントはないようです。
したがって、コードは次のようになります。
BYTE p[64] = { 139 }; // little-endian, all other bytes set to 0
BYTE g[64] = { 5 };
CRYPT_DATA_BLOB pblob;
pblob.cbData = sizeof( p);
pblob.pbData = p;
CRYPT_DATA_BLOB gblob;
gblob.cbData = sizeof( g );
gblob.pbData = g;
HCRYPTKEY hKey;
if ( ::CryptGenKey( m_hCryptoProvider, CALG_DH_SF,
( 512 << 16 ) | CRYPT_PREGEN, &hKey ) )
{
::CryptSetKeyParam( hKey, KP_P, ( LPBYTE ) &pblob, 0 );
他のヒント
私にはそう見えます KP_P
, KP_G
, KP_Q
DSS キー (デジタル署名標準?) 用です。Diffie-Hellman の場合は、次のようにする必要があるようです。 KP_PUB_PARAMS
そして渡す DATA_BLOB
それはを指します DHPUBKEY_VER3
構造。
参照している記事は Windows Mobile/Windows CE SDK からのものであることに注意してください。CE がデスクトップ/サーバーとは異なる動作をするのはこれが初めてではありません。
編集:CEは実装していない KP_PUB_PARAMS
. 。この構造をデスクトップで使用するには、次を参照してください。 Diffie-Hellman バージョン 3 公開キー BLOB.