Ich brauche Hilfe, wie man Java Private.pem richtig konstruiert. Ich habe eine ECDSA PEM-Datei in Java und eine in Python erstellt. Ich habe die richtige Python-Implementierung, aber die Java-Version ist nicht korrekt.PEM-Kodierung von ECDSA in Java
KeyPair pair = GenerateKeys();
PrivateKey priv = pair.getPrivate();
PublicKey pub = pair.getPublic();
// Convert to Bytes then Hex for new account params
byte[] bytePriv = priv.getEncoded();
byte[] bytePub = pub.getEncoded();
// save keys
SaveKeyToFile(bytePriv, "private", "private");
// Calls this function
public static void SaveKeyToFile(byte[] Key, String filename, String keyType) throws IOException, NoSuchAlgorithmException, NoSuchAlgorithmException, InvalidKeySpecException {
StringWriter stringWriter = new StringWriter();
PemWriter pemWriter = new PemWriter(stringWriter);
PemObjectGenerator pemObject = new PemObject("EC " + keyType.toUpperCase() + " KEY", Key);
pemWriter.flush();
pemWriter.close();
String privateKeyString = stringWriter.toString();
FileUtils.writeStringToFile(new File(filename + ".pem"), privateKeyString);
}
Für die ASN1 beide mit OpenSSL von Java und Python analysieren (Ist nicht hexdump wegen seiner Länge umfassen):
JAVA
0:d=0 hl=3 l= 141 cons: SEQUENCE
3:d=1 hl=2 l= 1 prim: INTEGER :00
6:d=1 hl=2 l= 16 cons: SEQUENCE
8:d=2 hl=2 l= 7 prim: OBJECT :id-ecPublicKey
17:d=2 hl=2 l= 5 prim: OBJECT :secp256k1
24:d=1 hl=2 l= 118 prim: OCTET STRING [HEXDUMP]
PYTHON
0:d=0 hl=2 l= 116 cons: SEQUENCE
2:d=1 hl=2 l= 1 prim: INTEGER :01
5:d=1 hl=2 l= 32 prim: OCTET STRING [HEXDUMP]
39:d=1 hl=2 l= 7 cons: cont [ 0 ]
41:d=2 hl=2 l= 5 prim: OBJECT :secp256k1
48:d=1 hl=2 l= 68 cons: cont [ 1 ]
50:d=2 hl=2 l= 66 prim: BIT STRING
Wie für die Ausgabe PEM:
Java:
-----BEGIN EC PRIVATE KEY-----
MIGNAgEAMBAGByqGSM49AgEGBSuBBAAKBHYwdAIBAQQgiEc2TOzXj4mrUisuv+0p
xZ/z+Z/VyIvWug17zjNOPIKgBwYFK4EEAAqhRANCAATWi28vsiZdfqbqodDZc1uz
UFwNcu90l2ezayH0L4ZYB+MfReMCBFG/P6kn12GLj3DipqmvRucgmOlFVmggm+nH
-----END EC PRIVATE KEY-----
Python:
-----BEGIN EC PRIVATE KEY-----
MHQCAQEEINTaEQvUvtOQlanp0lWv0KBcSs8IltKYH26OkoNxLQc5oAcGBSuBBAAK
oUQDQgAEcp3sseSpAXzIzWCwswYnsVnIZ0EEtkXl/CJWChQHilWLwWsxGq11/g/6
38UfZbsjE5TSf6zT8VXvTZE++u9c+A==
-----END EC PRIVATE KEY-----
Hilfe wäre sehr willkommen!
JCE ' PrivateKey.getEncoded() 'gibt unverschlüsselte PKCS8-Codierung zurück; der richtige PEM-Typ dafür ist 'BEGIN/END PRIVATE KEY' (ohne spezifischen Algorithmus wie 'EC') und dann OpenSSL und mit OpenSSL kompatible Dinge werden es lesen. Wenn Sie die "traditionelle" Algorithmus-spezifische Form von OpenSSL brauchen, die härter ist, aber meistens ein Betrogener; Ich muss jetzt gehen, aber kann das später bei Bedarf ausfüllen. PS: EC-Schlüssel/keyparis sind für ECDSA _usable_, aber nicht darauf beschränkt. Ein _cert_ OTOH kann durch KeyUsage begrenzt werden. –
Danke für die Info. Die Java-Pem-Ausgabe muss dieser Spezifikation entsprechen: https://tools.ietf.org/html/rfc5915. Es soll EC PRIVATE KEY haben. Beide Schlüssel enthalten die secp256k1-Kurve. Der Hex-Dump ist länger auf dem Java-1 und die Ganzzahl ist 0 statt 1. Nicht ganz sicher, wie Sie in die Details gelangen, um es zu korrigieren.Ich experimentiere gerade mit MiscPEMGenerator, um zu sehen, ob es mir hilft, die richtige Ausgabe zu erreichen. – dtseng
hast du wirklich die Koblitz-Kurve vor? Normalerweise wollen Leute secp256r1 (beachte das 'r'), da das das ist, das NIST P-256 – lockcmpxchg8b