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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top