2017-07-11 6 views
0

Ich erzeuge ein EC-Schlüsselpaar in C# BouncyCastle und versuche, den privaten Schlüssel in einer PEM-Datei mit dem PemWriter zu exportieren. Der Code für Dabei wird wie folgt:C# BouncyCastle EC Privater Schlüssel Export mit PemWriter

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

string path = @"c:\tmp\test\myprivkey.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(); 

Ein Beispiel Ausgabe aus dem Snippet oben ist:

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

Wenn jedoch das gleiche tun ‚openssl‘ und die gleiche EC-Kurve (secp384r1 mit), ist die resultierende PEM-Datei ganz anders, zB ,:

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----- 

Wie Sie, die Schlüssellänge zu sehen ist sehr unterschiedlich, und die P12-Datei ich mit dem ehemaligen erstelle nicht in den Windows-cert importiert werden st Erze. Ich muss etwas falsch mit C# BouncyCastle tun, kann aber nicht sehen, was (der Quellcode des PemWriter und andere verwandte Klassen zu sehen, zeigt keine offensichtlichen Fehler).

Jede Hilfe würde sehr geschätzt werden. Danke.

+0

Wenn die BC-generierten privaten Schlüssel der Prüfung PEM-Datei mit openssl, openssl meldet korrekt "Private-Key", "ASN1 OID" und "NIST CURVE" Felder, die letzteren beiden haben die gleichen Werte wie die der PEM-Datei von openssl generiert. CertUtil kann jedoch die P12-Datei, die mit dem BC-generierten privaten Schlüssel PEM erstellt wurde, nicht "ablegen", während dies erfolgreich mit dem P12 geschieht, der mit dem von openssl generierten privaten Schlüssel PEM erstellt wurde. – hyongsop

+0

Sie verwenden wahrscheinlich Kodierungen verschiedener asn.1 Typen. Versuchen Sie, 'openssl asn1parse -i -dump -i key.pem' auf beiden Tasten auszuführen, um dies zu überprüfen. – mat

+0

@mat Ja, das habe ich gerade gemacht. Es scheint, als ob die BC PEM-Datei den eigentlichen Schlüssel fehlt ?? Die ans1parse-Ausgabe der openssl-PEM-Datei hat eine zusätzliche Struktur, die in der BC-PEM-Datei fehlt. Diese Struktur sieht so aus: ** ... 65: d = 1 hl = 2 l = 100 Nachteile: cont [1] 67: d = 2 hl = 2 l = 98 prim: BIT STRING ... * * Diese Struktur befindet sich am Ende der openssl-PEM-Datei, und der Rest der Datei, die zu dieser Struktur führt, ist identisch mit denen in der BC-Datei. Wie finde ich die Asn.1-Typen der PEM-Dateien? – hyongsop

Antwort

0

Es stellt sich heraus, Sie beide eine Instanz von ECPrivateKeyStructure mit privaten und öffentlichen Schlüssel erstellen und die Base64-codierte Zeichenfolge des Objekts Datei speichern, zB ,:

... 
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:\tmp\myprivkey.pem"; 
TextWriter textWriter = new StreamWriter(path); 
textWriter.WriteLine(header); 
textWriter.WriteLine(privKeyStr); 
textWriter.WriteLine(tail); 
textWriter.Flush(); 
textWriter.Close(); 
... 
Verwandte Themen