0

ここに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います。何を与える?

4

2 に答える 2

2

使用している非常に短いキーが気に入らないだけかもしれません。

完全な例があるので、役立つかもしれないその記事のデスクトップ版を見つけました。

編集:

OP は例から、CryptGenKey にキーの長さを伝える必要があることを認識しました。これは、フラグの上位 16 ビットを使用するビット数に設定することによって行います。これを 0 のままにしておくと、デフォルトの鍵の長さが得られます。これは、デバイスのドキュメントの「備考」セクションに記載されており、デスクトップのドキュメントのdwFlagsパラメーター説明されています。

Windows XP 以降では、Diffie-Hellman キー交換アルゴリズムの場合、Base プロバイダーは既定で 512 ビット キーに設定され、Enhanced プロバイダー (既定) は既定で 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 );
于 2008-09-17T00:06:37.890 に答える
1

KP_P, KP_G,KP_Qは DSS 鍵 (デジタル署名規格?) 用のようです。Diffie-Hellman の場合、構造体を指すKP_PUB_PARAMSa を使用して渡すことになっているようです。DATA_BLOBDHPUBKEY_VER3

あなたが指している記事は、Windows Mobile/Windows CE SDK からのものであることに注意してください。CE がデスクトップ/サーバーとは異なる働きをしたのはこれが初めてではありません。

編集: CE は実装されていませんKP_PUB_PARAMS。デスクトップでこの構造を使用するには、Diffie-Hellman Version 3 Public Key BLOBsを参照してください。

于 2008-09-16T22:54:32.417 に答える