我有宝洁-如何使用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 );