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
CryptAcquireContext
para obtener un identificador para el proveedor criptográfico Diffie-Hellman de Microsoft. - Cree una clave Diffie-Hellman llamando a la función
CryptGenKey
para crear una nueva clave, o llamando a la funciónCryptGetUserKey
para 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ámetrodwDataLen
y 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ónCryptSetKeyParam
condwParam
establecido enKP_ALGID
y conpbData
establecido en un puntero a un valorALG_ID
que representa una clave de sesión, comoCALG_RC4
. La clave debe convertirse antes de usar la clave compartida en la funciónCryptEncrypt
oCryptDecrypt
. 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.