BouncyCastle y Microsoft Cng ECDH no coinciden las claves secretas

3

Estoy tratando de refactorizar algún código del lado del cliente de BouncyCastle a Microsoft Cng. Descubrí cómo convertir formato de clave (blobs de ECC) entre ellos, pero no pude calcular el mismo secreto.

Actualmente, el cliente usa Org.BouncyCastle.Crypto.Agreement.ECDHBasicAgreement.CalculateAgreement() para calcular el secreto compartido. La longitud del secreto compartido depende de la curva (por ejemplo, la longitud de los secretos compartidos para SecP224k1 es 28 bytes).

Microsoft Cng ( System.Security.Cryptography.ECDiffieHellman ) proporciona varios métodos: DeriveKeyMaterial , DeriveKeyFromHash . Sin embargo, ninguno de ellos devuelve un resultado de 28 bytes. DeriveKeyFromHash devuelve bytes de 16/20/32/48/64 depende de HashAlgorithm, y DeriveKeyMaterial devuelve los mismos 32 bytes que DeriveKeyFromHash (SHA256).

Editar: DeriveKey de Microsoft Cng devuelve el secreto Hash

¿Cómo calcular el mismo secreto usando Microsoft Cng?

    
pregunta SGKoishi 04.11.2018 - 23:58
fuente

1 respuesta

2

Gracias al comentario de @Dave Satchell.

Entro al código fuente de .Net Framework. Todas las llamadas DeriveKey System.Security.Cryptography.NCryptNative.UnsafeNativeMethods.NCryptDeriveKey , que es P / Invoke de ncrypt.dll. Tuvo que pasar una función de derivación clave a NCryptDeriveKey

Para cualquier persona que aún desee calcularlo sin BouncyCastle o OpenSSL: calculé el secreto compartido traduciendo código python .
Es posible que necesite implementar su propio BigInteger o using System.Numerics;
Nota: System.Numerics.BigInteger es little endian, y % (mod) funciona de manera diferente en C # y Python.

    
respondido por el SGKoishi 06.11.2018 - 16:29
fuente

Lea otras preguntas en las etiquetas