cryptography - shimo - vpn pptp mac
Estoy usando Wincrypt para Diffie-Hellman. ¿Puedo exportar el secreto compartido en texto plano? (1)
Esto se parece a lo que necesita ... desde: http://msdn.microsoft.com/en-us/library/aa381969(VS.85).aspx
Para importar una clave pública Diffie-Hellman y calcular la clave de sesión secreta
- Llame a la función
CryptAcquireContextpara obtener un identificador para el proveedor criptográfico Diffie-Hellman de Microsoft. - Cree una clave Diffie-Hellman llamando a la función
CryptGenKeypara crear una nueva clave, o llamando a la funciónCryptGetUserKeypara recuperar una clave existente. - Para importar la clave pública Diffie-Hellman al CSP, llame a la función
CryptImportKey, pasando un puntero a la clave pública BLOB en el parámetropbData, la longitud del BLOB en el parámetrodwDataLeny el identificador a la clave Diffie-Hellman en el parámetrohPubKey. Esto hace que se realice el cálculo,(Y^X) mod P, creando así la clave secreta compartida y completando el intercambio de claves. Esta llamada a función devuelve un identificador a la nueva clave de sesión secreta en el parámetrohKey. - En este punto, el Diffie-Hellman importado es del tipo
CALG_AGREEDKEY_ANY. Antes de poder utilizar la clave, debe convertirse en un tipo de clave de sesión. Esto se logra llamando a la funciónCryptSetKeyParamcondwParamestablecido enKP_ALGIDy conpbDataestablecido en un puntero a un valorALG_IDque representa una clave de sesión, comoCALG_RC4. La clave debe convertirse antes de usar la clave compartida en la funciónCryptEncryptoCryptDecrypt. Las llamadas realizadas a cualquiera de estas funciones antes de convertir el tipo de clave fallarán. - La clave de sesión secreta ahora está lista para ser utilizada para cifrado o descifrado.
- Cuando la clave ya no se necesita, destruya el identificador de la tecla llamando a la función
CryptDestroyKey.
OK-- gracias a Mike , pude hacer que Wincrypt generara un par de llaves Diffie-Hellman. Me di cuenta de exportar la clave pública y cómo importar la clave pública de la otra parte. De acuerdo con los documentos, al importar la clave pública de la otra parte, se ha calculado el secreto compartido. Estupendo.
Ahora necesito conocer ese secreto compartido, pero no creo que sea posible. Simplemente llamando a CryptExportKey con un tipo de PLAINTEXTKEYBLOB falla a menos que llame a CryptSetKeyParam para cambiar la ID del algoritmo de CALG_AGREEDKEY_ANY a algo ... else. Pero no quiero otra cosa, quiero el secreto compartido. La API, sin embargo, parece diseñada para desalentar esto.
¿Alguna idea por ahí? Debo señalar que el problema aquí es que solo estoy escribiendo un lado de una implementación de WiFi Protected Setup. Entonces el protocolo está definido para mí, y la otra parte no me está dando HCRYPTKEY.