Pour mon code, j'utilisé java 1.7 et bibliothèque BouncyCastle. Si vous utilisez Maven, il suffit d'ajouter à votre pom.xml:
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk16</artifactId>
<version>1.46</version>
</dependency>
Ou télécharger les pots dans le site BouncyCastle. Ceci est une API de cryptographie pour Java, avec beaucoup de choses utiles (y compris les classes pour gérer les clés de courbes elliptiques).
Le code de lecture de la clé publique et la conversion d'un objet est:
import java.security.KeyFactory;
import java.security.Security;
import java.security.interfaces.ECPublicKey;
import java.security.spec.ECPoint;
import java.security.spec.ECPublicKeySpec;
import org.bouncycastle.jce.ECNamedCurveTable;
import org.bouncycastle.jce.ECPointUtil;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.jce.spec.ECNamedCurveParameterSpec;
import org.bouncycastle.jce.spec.ECNamedCurveSpec;
import org.bouncycastle.util.encoders.Base64;
// you need to add the BouncyCastle provider to use its functionalities
Security.addProvider(new BouncyCastleProvider());
String publicK = "BBoN_OkTfE_0uObues82qHr96z8x3nepYoUwCBoftFDS_Vgx2MUHN1vAFxc1eDiyDrvmZ2bQ4sJq3F8Qz71RWI0=";
// publicK is encoded in base64, so you need to decode it first
byte[] publicBytes = Base64.decode(publicK.getBytes());
// spec for P-256 curve
ECNamedCurveParameterSpec spec = ECNamedCurveTable.getParameterSpec("prime256v1");
// create a KeyFactory with ECDSA (Elliptic Curve Diffie-Hellman) algorithm and use BouncyCastle as the provider
KeyFactory kf = KeyFactory.getInstance("ECDSA", BouncyCastleProvider.PROVIDER_NAME);
// code below just creates the public key from the bytes contained in publicK
// using the curve parameters (spec variable)
ECNamedCurveSpec params = new ECNamedCurveSpec("prime256v1", spec.getCurve(), spec.getG(), spec.getN());
ECPoint point = ECPointUtil.decodePoint(params.getCurve(), publicBytes);
ECPublicKeySpec pubKeySpec = new ECPublicKeySpec(point, params);
ECPublicKey pk = (ECPublicKey) kf.generatePublic(pubKeySpec);
System.out.println(pk.toString());
sortie:
EC Public Key
X: 1a0d00e9137c4034b8e6ee7acf36a87afdeb3f31de77a9628530081a1fb450d2
Y: 15831d8c507375bc01717357838b20ebbe66766d0e2c26adc5f10cfbd51588d
billets:
I » m pas au courant de toutes les mathématiques derrière les touches de la courbe elliptique, juste l'idée de base. Je sais qu'une courbe a des paramètres comme G
et n
(qui sont obtenus via les méthodes getG()
et getN()
) et qu'il y a quelques courbes "standard prédéfinies" (comme P-256) que vous pouvez obtenir en utilisant ECNamedCurveTable.getParameterSpec()
. Vous pouvez jeter un oeil à tous les math details si vous voulez. Il y a aussi un list of different standard curves et ceux qui sont considérés comme sécurisés.
ECPublicKey
étend PublicKey
, de sorte que vous pouvez l'utiliser comme un PublicKey
Merci beaucoup. Cela a fonctionné, mais pourriez-vous donner une brève explication théorique juste pour que je comprenne ce que je fais? – aayush456
De rien. Je ne suis pas un expert en mathématiques/cryptographie, mais j'ai ajouté quelques commentaires dans la réponse. Tenez-moi au courant si vous avez besoin de plus d'informations. –