P&G を持っています。Wincrypt API を使用して Diffie-Hellman キーペアを生成するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/76581

質問

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.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top