Girare una chiave di byte codificato nuovamente dentro di essa l'ecPublicKey originale in Bouncy Castle
-
19-09-2019 - |
Domanda
In Java ho una chiave pubblica ECDH che io mando come un array di byte.
Una volta ho ricevuto l'array di byte come posso trasformarlo di nuovo in una chiave pubblica?
Sto usando Bouncy Castle, ma una soluzione Java sarebbe altrettanto utile.
Grazie
Soluzione
Come sono i byte prime formattati per la chiave ECDH? Dove vuoi arrivare i byte prime?
In generale, si usa la classe * Spec opportuno trasformare il materiale grezzo in chiave di una chiave, ma il ECPublicKeySpec e classi DHPublicKeySpec non accettano un array di byte crudo.
Altri suggerimenti
Quando avete ottenuto la chiave codificata, supponendo che si è utilizzato il default "[propria coppia di chiavi] .getPublic (). GetEncoded ()" il metodo, questo funzionerà.
X509EncodedKeySpec ks = new X509EncodedKeySpec(pubKeyByteString.toByteArray());
KeyFactory kf;
try {
kf = java.security.KeyFactory.getInstance("ECDH");
} catch (NoSuchAlgorithmException e) {
log.error("Cryptography error: could not initialize ECDH keyfactory!", e);
return;
}
ECPublicKey remotePublicKey;
try {
remotePublicKey = (ECPublicKey)kf.generatePublic(ks);
} catch (InvalidKeySpecException e) {
log.warn("Received invalid key specification from client",e);
return;
} catch (ClassCastException e) {
log.warn("Received valid X.509 key from client but it was not EC Public Key material",e);
return;
}
ho trovato la soluzione di cui sopra da @LaceCard non ha funzionato per me. In generale questo non è ovvio, ma poi di nuovo niente in crittografia è;)
String key = "MihU9ztW9sEvkBL6BxyaOMgkSbodNS8yoHaHcio+WE...blahblah"
byte[] keyBytes = Base64.decode(key);
//If using Android and Spongycastle provider should be "SC"
KeyFactory kf = KeyFactory.getInstance("ECDH", "BC");
//CURVE_NAME e.g prime192v1
ECParameterSpec ecSpec = ECNamedCurveTable.getParameterSpec(CURVE_NAME);
ECPoint point = ecSpec.getCurve().decodePoint(keyBytes);
ECPublicKeySpec pubSpec = new ECPublicKeySpec(point, ecSpec);
ECPublicKey myECPublicKey = (ECPublicKey) kf.generatePublic(pubSpec);
Nota: è necessario gestire le potenziali eccezioni in modo appropriato