我有宝洁-如何使用Wincrypt API生成Diffie-Hellman密钥对?

时间:2020-03-05 18:57:05  来源:igfitidea点击:

这里有一篇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"。是什么赋予了?

解决方案

回答

在我看来," KP_P"," KP_G"和" KP_Q"用于DSS密钥(数字签名标准?)。对于Diffie-Hellman来说,我们似乎应该使用KP_PUB_PARAMS并传递指向DHPUBKEY_VER3结构的DATA_BLOB

请注意,我们指向的文章来自Windows Mobile / Windows CE SDK。 CE并非第一次不同于台式机/服务器。

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

回答

可能是它不喜欢我们正在使用的非常短的键。

我发现该文章的桌面版本可能会有所帮助,因为它有完整的示例。

编辑:

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 );