有一篇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
。是什么给了什么?
答案 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_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 Version 3 Public Key BLOBs。