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.