/ / C # BouncyCastle EC Exportación de clave privada usando PemWriter - c #, criptografía, bouncycastle, pem, key-pair

C # BouncyCastle EC Exportación de clave privada usando PemWriter - c #, criptografía, bouncycastle, pem, key-pair

Estoy generando un par de claves EC en C # BouncyCastle y tratando de exportar la clave privada en un archivo PEM usando el PemWriter. El código para hacerlo es el siguiente:

var ecKeyPairGenerator = new ECKeyPairGenerator();
CKeyGenerationParameters ecKeyGenParams = new ECKeyGenerationParameters(SecObjectIdentifiers.SecP384r1, new SecureRandom());
ecKeyPairGenerator.Init(ecKeyGenParams);
AsymmetricCipherKeyPair pair = ecKeyPairGenerator.GenerateKeyPair();

string path = @"c:tmptestmyprivkey.pem";
TextWriter textWriter = new StreamWriter(path);
PemWriter pemWriter = new PemWriter(textWriter);
// passing pair results in the private key being written out
pemWriter.WriteObject(pair);
pemWriter.Writer.Flush();
pemWriter.Writer.Close();

Un ejemplo de salida del fragmento anterior es:

-----BEGIN EC PRIVATE KEY-----
MD4CAQEEMJvNXtTUd7A/fY/9/LSXM+Xb/6QS7GydeART/OieN3zh23Uuy0tgiS1D
rohXMgiPvqAHBgUrgQQAIg==
-----END EC PRIVATE KEY-----

Sin embargo, cuando se hace lo mismo con "openssl" y la misma curva EC (secp384r1), el archivo PEM resultante es bastante diferente, por ejemplo,

openssl ecparam -name secp384r1 -genkey -out mykey2.pem -noout

-----BEGIN EC PRIVATE KEY-----
MIGkAgEBBDBqCE9+AWL56cvR2/tRNdyaTIlJnfr6TbhCG+Q48w6yyKR+hE0jkeOV
7yh1t8NwqT6gBwYFK4EEACKhZANiAAS2uLv7KG6RRBZBOecaxBz8FsMobnxgZkbQ
8cKdL1DRym1lUDwgfX8AxOC6qkuD1k0UekpHcwiy1mSghy4640qBAKcR3mVghMVF
77Nm8x6nwNijWZroeqhjrw268PPPuAw=
-----END EC PRIVATE KEY-----

Como puedes ver, la longitud de la clave es muy diferente,y el archivo P12 que creo con el anterior no se importa a las tiendas de certificados de Windows. Debo estar haciendo algo mal con C # BouncyCastle pero no puedo ver qué (no se ve el código fuente de PemWriter y otras clases relacionadas) apunta a cualquier error obvio).

Cualquier ayuda sería muy apreciada. Gracias.

Respuestas

0 para la respuesta № 1

Resulta que puede crear una instancia de ECPrivateKeyStructure con claves privadas y públicas y guardar la cadena codificada en Base64 del objeto en el archivo, por ejemplo,:

...
int orderBitLength = privKeyParam.Parameters.N.BitLength;
X962Parameters x962 = new X962Parameters(privKeyParam.PublicKeyParamSet);
ECPrivateKeyStructure privKeyStruct =
new ECPrivateKeyStructure(orderBitLength, privKeyParam.D, pubKeyInfo.PublicKeyData, x962);

string header = @"-----BEGIN EC PRIVATE KEY-----";
string privKeyStr = Convert.ToBase64String(privKeyStruct.GetDerEncoded(),
Base64FormattingOptions.InsertLineBreaks);
string tail = @"-----END EC PRIVATE KEY-----";

string path = @"c:tmpmyprivkey.pem";
TextWriter textWriter = new StreamWriter(path);
textWriter.WriteLine(header);
textWriter.WriteLine(privKeyStr);
textWriter.WriteLine(tail);
textWriter.Flush();
textWriter.Close();
...