Pregunta

Hay un artículo de MSDN aquí, pero no llego muy lejos:

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

falla aquí con NTE_BAD_DATA.Estoy usando MS_DEF_DSS_DH_PROV.¿Lo que da?

¿Fue útil?

Solución

Puede ser que simplemente no le gusten las teclas tan cortas que estás usando.

encontré la versión de escritorio de ese artículo lo que puede ayudar, ya que tiene un ejemplo completo.

EDITAR:

El OP se dio cuenta del ejemplo de que debe decirle a CryptGenKey cuánto duran las claves, lo cual se hace configurando los 16 bits superiores de las banderas en la cantidad de bits que desea usar.Si lo deja en 0, obtendrá la longitud de clave predeterminada.Este es documentado en el Observaciones sección de la documentación del dispositivo y con la dwBanderas parámetro en el documentación de escritorio.

Para el algoritmo de intercambio de claves Diffie-Hellman, el proveedor base utiliza de forma predeterminada claves de 512 bits y el proveedor mejorado (que es el predeterminado) utiliza de forma predeterminada claves de 1024 bits, en Windows XP y versiones posteriores.No parece haber ninguna documentación sobre las longitudes predeterminadas en CE.

Por tanto, el código debería 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 );

Otros consejos

Me parece que KP_P, KP_G, KP_Q son para claves DSS (¿Estándar de firma digital?).Para Diffie-Hellman parece que se supone que debes usar KP_PUB_PARAMS y pasar un DATA_BLOB que apunta a un DHPUBKEY_VER3 estructura.

Tenga en cuenta que el artículo al que apunta es del SDK de Windows Mobile/Windows CE.No sería la primera vez que CE funciona de manera diferente al escritorio/servidor.

EDITAR:CE no implementa KP_PUB_PARAMS.Para utilizar esta estructura en el escritorio, consulte BLOB de clave pública Diffie-Hellman versión 3.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top