En Java, j'ai une clé publique ECDH que j'envoie en tant que tableau d'octets. P>
Une fois que j'ai reçu le tableau d'octets, comment puis-je le retourner dans une clé publique? P>
J'utilise le château de Bouncy, mais une solution Java serait tout aussi utile. P>
merci p>
3 Réponses :
Comment les octets bruts sont-ils formatés pour la clé ECDH? Où obtenez-vous les octets bruts? P>
Généralement, on utilise la classe de spécifications appropriée * pour transformer le matériau de clé brute en une clé, mais le ECPublickeyspec et dhpublickeyspec classes n'accepte pas un tableau d'octet brut. P>
Lorsque vous avez obtenu la clé codée, en supposant que vous utilisiez la méthode par défaut "[votre clé KeyPair] ..gepublic (). GetCeucoded ()", cela fonctionnera.
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;
}
Je reçois java.security.spec.invalidkeyspecException: Spécification de clé codée non reconnue
J'ai trouvé la solution ci-dessus par @lacecard ne fonctionnait pas pour moi. En général, ce n'est pas évident, mais à nouveau, rien dans la cryptographie n'est;)
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);
Quelle est la classe que vous utilisez pour représenter votre clé publique Java ECDH? Vous obtenez de meilleures réponses en montrant votre code et n'exigeant pas que les gens devinent.