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参数。

对于 Diffie-Hellman 密钥交换算法,在 Windows XP 及更高版本上,基本提供程序默认为 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 );
于 2008-09-17T00:06:37.890 回答
1

在我看来KP_PKP_G,KP_Q是用于 DSS 密钥(数字签名标准?)。对于 Diffie-Hellman 来说,看起来您应该使用KP_PUB_PARAMS并传递DATA_BLOB指向DHPUBKEY_VER3结构的 a 。

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

编辑:CE 没有实现KP_PUB_PARAMS. 要在桌面上使用此结构,请参阅Diffie-Hellman 版本 3 公钥 BLOB

于 2008-09-16T22:54:32.417 回答