Ho P&G: come posso utilizzare l'API Wincrypt per generare una coppia di chiavi Diffie-Hellman?

StackOverflow https://stackoverflow.com/questions/76581

Domanda

C'è un articolo di MSDN Qui, ma non sto andando molto lontano:

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

Fallisce qui con NTE_BAD_DATA.sto usando MS_DEF_DSS_DH_PROV.Cosa dà?

È stato utile?

Soluzione

Può darsi che semplicemente non gli piacciano i tasti molto corti che stai utilizzando.

ho trovato la versione desktop di quell'articolo che può aiutare, poiché ha un esempio completo.

MODIFICARE:

L'OP ha capito dall'esempio che devi dire a CryptGenKey quanto sono lunghe le chiavi, cosa che fai impostando i primi 16 bit dei flag sul numero di bit che desideri utilizzare.Se lasci questo valore su 0, otterrai la lunghezza della chiave predefinita.Questo È documentato nel Osservazioni sezione della documentazione del dispositivo e con il file dwFlags parametro nel documentazione da tavolo.

Per l'algoritmo di scambio di chiavi Diffie-Hellman, il provider Base utilizza per impostazione predefinita chiavi a 512 bit e il provider Avanzato (che è l'impostazione predefinita) utilizza chiavi a 1024 bit per impostazione predefinita, su Windows XP e versioni successive.Non sembra esserci alcuna documentazione per le lunghezze predefinite su CE.

Il codice dovrebbe quindi essere:

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

Altri suggerimenti

Mi sembra questo KP_P, KP_G, KP_Q sono per le chiavi DSS (Digital Signature Standard?).Per Diffie-Hellman sembra che dovresti usarlo KP_PUB_PARAMS e passare a DATA_BLOB che indica a DHPUBKEY_VER3 struttura.

Tieni presente che l'articolo a cui fai riferimento proviene da Windows Mobile/Windows CE SDK.Non sarebbe la prima volta che CE funziona diversamente dal desktop/server.

MODIFICARE:CE non implementa KP_PUB_PARAMS.Per utilizzare questa struttura sul desktop, vedere BLOB a chiave pubblica Diffie-Hellman versione 3.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top