繁体   English   中英

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

[英]I have P & G— how do I use the Wincrypt API to generate a Diffie-Hellman keypair?

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

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

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

编辑:

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

在我看来, 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版本3公钥BLOB

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM