11
votes

Comment obtenir un public de publicité RSA en donnant un fichier privé?

Je cherche une fonction Java qui obtiendra un RSA privatekeyKey et retournera la bonnekey RSA de RSA?

Alternativement, y a-t-il une fonction qui nous dira si la RSA PrivateKey / PublicationKey est valide?


3 commentaires

Garder son calme. Un forum est assez différent d'un chat en direct. Gardez toujours à l'esprit que les utilisateurs sont ici avec leur propre volonté et chaque fois qu'ils le souhaitent et peuvent.


Définissez ce que vous entendez par «valide».


Outre les réponses données, si vous pouvez toujours effectuer un signe / vérification (sur n'importe quelle valeur) pour voir si les touches correspondent. Notez qu'une fois de temps en temps c'est gênant, par ex. Si un compte d'utilisation est conservé pour une clé privée (certaines cartes HSM et les cartes à puce). En comparant uniquement le module ou un hachage sur le module, le module doit être unique pour chaque paire de clés. Pas besoin d'un exposant public.


5 Réponses :


-4
votes

AFAIK Vous ne pouvez pas dériver l'autre clé d'une paire de clés RSA, étant donné une clé. Cela équivaut à enfreindre RSA.

Pour tester une paire, il suffit de chiffrer quelque chose en utilisant une clé et de la déchiffrer à l'aide de l'autre pour voir si vous obtenez le résultat initial.


5 commentaires

Merci beaucoup! Pouvez-vous être un peu plus clair sur la deuxième réponse? Avez-vous le code Java pour le faire?


Je pense que cela est faux. Selon Stackoverflow.com/Questtions/5244129/... Vous pouvez obtenir une clé RSA publique à partir de la clé privée.


Mk, savez-vous comment le faire avec Java?


@Mk c'est-à-dire parce que la clé publique est incluse dans la clé privée.


Dériver la clé publique d'une clé privée est certainement possible. Voir ma réponse.



12
votes

Si vous avez votre clé privée comme un RSAPrivateCekey objet, vous pouvez obtenir l'exposant public ainsi que moduleux.

alors vous pouvez créer la clé publique comme SO: P>

RSAPublicKeySpec publicKeySpec = new java.security.spec.RSAPublicKeySpec(modulus, exponent);   
try {   
     KeyFactory keyFactory = KeyFactory.getInstance("RSA");   

     PublicKey publicKey = keyFactory.generatePublic(publicKeySpec);   
} catch (Exception e) {   
     e.printStackTrace();   
} 


1 commentaires

Le constructeur est en fait Rsapublickeyspec (BigInteger Modulus, Biginteger PubliceXponent) docs.oracle.com/javase/7/docs/api/java/security/spec/...



5
votes

Je ne peux penser à aucune raison de bonne raison que vous auriez besoin de cela. Mais ici, c'est le cas: xxx


0 commentaires

0
votes

Si vous avez un objet de type rsaprivatekey , alors vous devez faire deux choses:

  1. Obtenez le module. EASY: PrivateKey.GetModulus ()
  2. calculer l'exposant public. C'est un peu délicat mais pas impossible. Voir le Définition de l'exposant public . Habituellement, l'exposant public est 65537 .

    Après avoir obtenu le module et l'exposant public, vous pouvez suivre la réponse de Peteyb.


0 commentaires

1
votes

Comme d'autres personnes ont noté, si vous avez une touche CODE> RSA CRT CODE>, vous pouvez extraire la clé publique de celle-ci. Cependant, il est en fait non fort> possible de récupérer une clé publique d'une clé privée pure.

La raison de celle-ci est facile: lors de la génération de clés RSA, il n'y a en réalité aucune différence entre le privé et le public clé. On est choisi d'être privé, le reste est public alors. P>

Donc, si vous pouviez calculer la clé publique d'une clé privée pure, vous pouvez par définir calculer la clé privée de la clé publique de la clé publique ... p>

Si vous avez les deux, vous pouvez réellement tester facilement s'ils correspondent à: P>

RSAPublicKey rsaPublicKey = (RSAPublicKey) publicKey;
RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) privateKey;
return rsaPublicKey.getModulus().equals( rsaPrivateKey.getModulus() )
  && BigInteger.valueOf( 2 ).modPow(
  rsaPublicKey.getPublicExponent().multiply( rsaPrivateKey.getPrivateExponent() )
    .subtract( BigInteger.ONE ), 
  rsaPublicKey.getModulus() ).equals( BigInteger.ONE );


0 commentaires