Ho P&G: come posso utilizzare l'API Wincrypt per generare una coppia di chiavi Diffie-Hellman?
-
09-06-2019 - |
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à?
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.