Wie bekomme ich ein PublicKey-Objekt aus EG-public-key-bytes?
Bin ich eine Anwendung entwickeln, die Anforderungen zu validieren SHA256withECDSA
Signaturen 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 isValidSignature
fü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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Hüpfburg Beispiel-code auf elliptic curve key-paar-Generierung und key-Fabriken kam mir ziemlich nah.
Einmal habe ich es geschafft, zu schaffen, ein ECDSA-Schlüssel-Fabrik und eine Kurve-Spezifikation für die
secp256r1
/NIST P-256
/P-256
/prime256v1
Kurve konnte ichECPointUtil.decodePoint
erhalten Sie einen Kurvenpunkt. Ich könnte dann generieren Sie ein public-key-Spezifikation, die es mir ermöglicht, generieren Sie ein public-key-so: