Bouncy Castle でバイトエンコードされたキーを元の ECPublicKey に戻す
-
19-09-2019 - |
質問
Java では、バイト配列として送信する ECDH 公開キーがあります。
バイト配列を受け取ったら、どうすればそれを公開鍵に戻すことができますか?
私は Bouncy Castle を使用していますが、Java ソリューションも同様に便利です。
ありがとう
解決
ECDH キーの生のバイトはどのようにフォーマットされますか?生のバイトはどこで入手していますか?
一般に、適切な *Spec クラスを使用して生のキーマテリアルをキーに変換しますが、 ECPublicKeySpec そして DHPublicKeySpec クラスは生のバイト配列を受け入れません。
他のヒント
あなたはデフォルトを使用と仮定すると、符号化された鍵を得たときは、 "[あなたの鍵ペア] .getPublic()。クラスのgetEncoded()" メソッド、これは動作します。
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;
}
私は@LaceCardにより、上記溶液が私のために動作しませんでした。一般に、これは明らかにされていませんが、その後、再び暗号には何もありません。)
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);
注:あなたが適切に潜在的な例外を処理する必要があります。
所属していません StackOverflow