
[英]I'm using Wincrypt for Diffie-Hellman— can I export the shared secret in plain text?
[英]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_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版本3公钥BLOB 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.