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

===============>>#1 票数: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 );

===============>>#2 票数:1

在我看来, 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

  ask by translate from so

未解决问题?本站智能推荐:

1回复

我将Wincrypt用于Diffie-Hellman,可以将共享密钥导出为纯文本格式吗?

好的-感谢Mike ,我能够使Wincrypt生成Diffie-Hellman密钥对。 我想出了导出公共密钥的方法,以及如何导入另一方的公共密钥的方法。 根据文档,导入另一方的公钥后,已计算出共享机密。 大。 我现在需要掌握这个共享的秘密,但我认为这是不可能的。 简单地调用Cryp
1回复

使用Python生成与Java兼容的Diffie-Hellman

此问题是从密码学堆栈交换迁移的,因为可以在堆栈溢出中回答。 已于26天前迁移。 我试图用Python
1回复

将椭圆曲线Diffie-Hellman与辅因子密钥结合使用以生成对称密钥

我是ECDH的新手,想在Java中生成一个秘密密钥。 我想在辅助因子推导中使用椭圆曲线Diffie-Hellman。 我将P-256曲线用于椭圆曲线操作。 我计划将所得的机密用作我的分组密码的对称密钥。 我一直在努力,并有以下工作示例。 这将生成密钥。 恐怕我使用的是临时的
1回复

为什么在Diffie-Hellman密钥交换中使用素数?

Diffie-Hellman密钥交换算法使用类似于2^8 mod n ,其中n是素数。 使用素数而不是其他数字的原因是什么?
3回复

生成Diffie-hellman参数(生成器)

我正在尝试实现diffie-hellman密钥交换。 假设我发现了一个大质数p-如何找到一个生成器g ? 受我必须使用的多精度库的限制,只能使用一些基本操作(+,*,-,/,pow,modExp,modMult,mod,gcd,isPrime,genRandomPrime,genRand
2回复

在Ruby中为Diffie-Hellman生成大质数

我正在为我的大学课程之一的项目在ruby中编写diffie-hellman密钥交换的实现。 我需要生成至少500位长的大(安全)素数。 有任何想法吗? 我应该使用OpenSSL库吗? 如果是这样,您会推荐什么功能?
1回复

Diffie-Hellman密钥交换-澄清吗?

简要 : 爱丽丝(Alice)和鲍勃(Bob)试图进行交流,而不希望夏娃(正在听)知道他们将要谈论的话题。 所以 爱丽丝(Alice)和鲍勃(Bob)在质数模和生成器上公开达成共识。 说 发电机= 3 素数= 17 因此公式将是(例如):
1回复

禁用diffie-hellman或设置会话密钥

您知道是否可以禁用Diffie-Hellman或为openssh设置固定的会话密钥吗? 实际上,我想使用WireShark分析流量,并且需要对其解密。
1回复

通过套接字接收Diffie-Hellman密钥错误

我一直在做大量研究,找不到解决此问题的方法。 我已经花了几个小时,无法解决问题,所以希望这里的人比我更有经验,可以为您提供帮助。 该程序可能不是最佳实践,但这是一项作业。 我正在使用RSA传输公钥,但是更重要的是,我正在尝试将Diffie Hellman参数从Bob(服务器)传输到Al
2回复

如何使用nodejs中的Diffie-Hellman api实际加密某些内容?

我在这里看一下nodejs crypto文档中的非常简单的演示: https ://nodejs.org/api/crypto.html#crypto_crypto_getdiffiehellman_group_name 他们很容易演示如何获得共享秘密...现在怎样? 如何使用所述共