Tenho P&G – como uso a API Wincrypt para gerar um par de chaves Diffie-Hellman?
-
09-06-2019 - |
Pergunta
Há um artigo do MSDN aqui, mas não estou indo muito longe:
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 );
Falha aqui com NTE_BAD_DATA
.estou a usar MS_DEF_DSS_DH_PROV
.O que da?
Solução
Pode ser que ele simplesmente não goste das teclas muito curtas que você está usando.
eu encontrei a versão desktop desse artigo o que pode ajudar, pois tem um exemplo completo.
EDITAR:
O OP percebeu a partir do exemplo que você precisa informar ao CryptGenKey quanto tempo as chaves têm, o que você faz definindo os 16 bits superiores dos sinalizadores para o número de bits que deseja usar.Se você deixar como 0, obterá o comprimento da chave padrão.Esse é documentado no Observações seção da documentação do dispositivo e com o dwFlags parâmetro no documentação da área de trabalho.
Para o algoritmo de troca de chaves Diffie-Hellman, o provedor Base usa como padrão chaves de 512 bits e o provedor Enhanced (que é o padrão) usa como padrão chaves de 1024 bits, no Windows XP e posterior.Não parece haver nenhuma documentação para os comprimentos padrão no CE.
O código deve, portanto, ser:
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 );
Outras dicas
Parece-me que KP_P
, KP_G
, KP_Q
são para chaves DSS (padrão de assinatura digital?).Para Diffie-Hellman, parece que você deveria usar KP_PUB_PARAMS
e passar um DATA_BLOB
que aponta para um DHPUBKEY_VER3
estrutura.
Observe que o artigo que você está apontando é do SDK do Windows Mobile/Windows CE.Não seria a primeira vez que o CE funcionava de forma diferente do desktop/servidor.
EDITAR:CE não implementa KP_PUB_PARAMS
.Para usar esta estrutura na área de trabalho, consulte BLOBs de chave pública Diffie-Hellman versão 3.