Wie bekomme ich ein PublicKey-Objekt aus EG-public-key-bytes?

Bin ich eine Anwendung entwickeln, die Anforderungen zu validieren SHA256withECDSASignaturen mit Hilfe von secp256r1 (NIST P-256, P-256, prime256v1) öffentlichen Schlüssel.

Den öffentlichen Schlüsseln erzeugt werden, indem eine andere Anwendung zu einem früheren Zeitpunkt gespeichert und in meine Datenbank in hex-Codierung. Das format des hex-string ist hier äquivalent zu den hex-string OpenSSL erzeugen würde beim Aufruf openssl ec -in x.pem -noout -text auf eine Datei x.pem zuvor generiert openssl ecparam -genkey -name secp256r1 -out x.pem.
Die Nachricht und die Signatur werden empfangen von einer anderen Anwendung.
Betrachten Sie die folgenden Testdaten ein:

//Stored in Database
byte[] pubKey = DatatypeConverter.parseHexBinary("049a55ad1e210cd113457ccd3465b930c9e7ade5e760ef64b63142dad43a308ed08e2d85632e8ff0322d3c7fda14409eafdc4c5b8ee0882fe885c92e3789c36a7a");

//Received from Other Application
byte[] message = DatatypeConverter.parseHexBinary("54686973206973206a75737420736f6d6520706f696e746c6573732064756d6d7920737472696e672e205468616e6b7320616e7977617920666f722074616b696e67207468652074696d6520746f206465636f6465206974203b2d29");
byte[] signature = DatatypeConverter.parseHexBinary("304402205fef461a4714a18a5ca6dce6d5ab8604f09f3899313a28ab430eb9860f8be9d602203c8d36446be85383af3f2e8630f40c4172543322b5e8973e03fff2309755e654");

Nun diese sollte eine gültige Signatur.

Mein Ziel ist es zu überprüfen der Signatur über die Nachricht, die mithilfe der Java-und/oder Bouncycastle crypto-API. Habe ich eine Methode isValidSignaturefür die:

private static boolean isValidSignature(byte[] pubKey, byte[] message,
        byte[] signature) throws NoSuchAlgorithmException, NoSuchProviderException, InvalidKeyException, SignatureException, InvalidKeySpecException {
    Signature ecdsaVerify = Signature.getInstance("SHA256withECDSA", new BouncyCastleProvider());
    ecdsaVerify.initVerify(getPublicKeyFromHex(pubKey));
    ecdsaVerify.update(message);
    return ecdsaVerify.verify(signature);
}

Habe ich versucht, extrahieren des öffentlichen Schlüssels:

KeyFactory.generatePublic:

private static PublicKey getPublicKeyFromHex(byte[] pubKey) throws NoSuchAlgorithmException, NoSuchProviderException, InvalidKeySpecException {
    KeyFactory fact = KeyFactory.getInstance("ECDSA", new BouncyCastleProvider());
    return fact.generatePublic(new X509EncodedKeySpec(pubKey));
}

Aber das wirft ein java.security.spec.InvalidKeySpecException (DER Länge mehr als 4 bytes: 26).
Was kann ich tun, um zu Parsen?

  • Nur um zu erlauben, Richtigkeit beim kopieren des Codes; -noout option für OpenSSL ist falsch.
  • Danke, korrigiert.
InformationsquelleAutor mritz_p | 2014-10-02
Schreibe einen Kommentar