我有P& G--如何使用Wincrypt API生成Diffie-Hellman密钥对?

时间:2008-09-16 20:25:22

标签: cryptography cryptoapi diffie-hellman

有一篇MSDN文章here,但我没有走得太远:

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。是什么给了什么?

2 个答案:

答案 0 :(得分:2)

可能它只是不喜欢您正在使用的非常短的按键。

我发现the desktop version of that article可能有所帮助,因为它有一个完整的例子。

编辑:

OP通过示例实现了你必须告诉CryptGenKey密钥的长度,你可以通过将标志的前16位设置为你想要使用的位数来实现。如果将其保留为0,则会获得默认密钥长度。 记录在设备文档的备注部分,以及desktop documentation中的 dwFlags 参数中。

对于Diffie-Hellman密钥交换算法,在Windows XP及更高版本中,Base提供程序默认为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 );

答案 1 :(得分:1)

我认为KP_PKP_GKP_Q适用于DSS密钥(数字签名标准?)。对于Diffie-Hellman,您似乎应该使用KP_PUB_PARAMS并传递指向DATA_BLOB结构的DHPUBKEY_VER3

请注意,您指向的文章来自Windows Mobile / Windows CE SDK。这不是CE第一次与桌面/服务器的工作方式不同。

编辑:CE未实施KP_PUB_PARAMS。要在桌面上使用此结构,请参阅Diffie-Hellman Version 3 Public Key BLOBs