2017-04-05 6 views
1

J'essaie d'envoyer des notifications push Web à mon navigateur et je suis capable de m'abonner avec succès. Je reçois un objet d'abonnement avec "une clé publique Diffie-Hellman à courbe elliptique sur une courbe P-256".Convertir la chaîne java P-256 DH en java PublicKey

Je veux convertir cette chaîne en une clé publique dans Java mais continuer à obtenir une exception de format de clé non valide.

Voici le code que je suis en train:

String publicK = "BBoN_OkTfE_0uObues82qHr96z8x3nepYoUwCBoftFDS_Vgx2MUHN1vAFxc1eDiyDrvmZ2bQ4sJq3F8Qz71RWI0="; 
    byte[] publicBytes = publicK.getBytes(); 
    X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicBytes); 
    KeyFactory keyFactory = KeyFactory.getInstance("DiffieHellman"); 
    PublicKey pubKey = keyFactory.generatePublic(keySpec); 

Quelqu'un pourrait-il me aider s'il vous plaît? Le chiffrement Noob ici:/

Répondre

0

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

+0

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

+0

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. –