BouncyCastle e Microsoft Cng ECDH mancata corrispondenza della chiave segreta

3

Sto cercando di refactoring alcuni codici lato client da BouncyCastle a Microsoft Cng. Ho capito come convertire il formato chiave (blob dei tasti ECC) tra di loro, ma non sono riuscito a calcolare lo stesso segreto.

Attualmente, il client utilizza Org.BouncyCastle.Crypto.Agreement.ECDHBasicAgreement.CalculateAgreement() per calcolare il segreto condiviso. La lunghezza del segreto condiviso dipende dalla curva (ad esempio, la lunghezza dei segreti condivisi per SecP224k1 è 28 byte).

Microsoft Cng ( System.Security.Cryptography.ECDiffieHellman ) fornisce diversi metodi: DeriveKeyMaterial , DeriveKeyFromHash . Tuttavia, nessuno di questi restituisce un risultato di 28 byte. DeriveKeyFromHash restituisce byte di 16/20/32/48/64 dipende da HashAlgorithm e DeriveKeyMaterial restituisce gli stessi 32 byte di DeriveKeyFromHash (SHA256).

Modifica: DeriveKey di Microsoft Cng restituisce Hashed secret.

Come si calcola lo stesso segreto usando Microsoft Cng?

    
posta SGKoishi 04.11.2018 - 23:58
fonte

1 risposta

2

Grazie al commento di @Dave Satchell.

Vado dentro al codice sorgente di .Net Framework. Tutto DeriveKey chiama System.Security.Cryptography.NCryptNative.UnsafeNativeMethods.NCryptDeriveKey , che è P / Invoke di ncrypt.dll. Devi passare una funzione di derivazione della chiave a NCryptDeriveKey

Per chiunque ancora voglia calcolarlo senza BouncyCastle o OpenSSL: Ho calcolato il segreto condiviso traducendo codice python .
Potrebbe essere necessario implementare il proprio BigInteger o using System.Numerics;
Nota: System.Numerics.BigInteger è little endian e % (mod) funziona in C # e in Python.

    
risposta data 06.11.2018 - 16:29
fonte

Leggi altre domande sui tag