11
votes

Comment obtenir la taille d'une clé RSA en Java

donné un java.security.interfaces.rsakey, comment puis-je obtenir sa taille?


4 Réponses :


25
votes

Vous pouvez essayer ceci:

key.getModulus().bitLength();


2 commentaires

Méfiez-vous, cette stratégie peut échouer si votre clé dispose de huit zéros de premier plan. Malheureusement, il y a des cas interopers où la sélection d'une puissance de deux est nécessaire. Si vous essayez d'importer une clé publique générée par Java dans .NET et utilisez-la pour chiffrer les données, elle ne déchiffrera pas en Java, à moins que la longueur de la clé correspond aux attentes. Si vous avez généré une clé de 2048 bits, vous ne pouvez pas donner une touche .NET une clé avec 2040 bits (8 meubles de zéros dans le boîtier de clé) ou 2052 bits (si vous tournez la biginteger en une chaîne hexagonale, vous pouvez obtenir un 0) supplémentaire 0). Vous devez lui donner exactement 2048 bits. Il affecte les schémas de rembourrage OAEP.


Comme expliqué dans Stackoverflow.com/Questtions/11729893/...



4
votes

La taille d'une clé RSA est le nombre de bits dans son module, vous voulez donc myrsakey.getmodulus (). Bitlength () .


1 commentaires

4min trop tard, putain! : P



4
votes

(EDIT: J'ai écrit cette réponse avant que je comprenne les restrictions placées sur les entiers premiers générés pour une clé RSA. http://csrc.nist.gov/publications/fips/fips186-3/fips_186-3.pdf Je crois maintenant que tout bon générateur de clés devrait assurer que le module est compris entre 2 ^ (n-1) et 2 ^ n-1. Ainsi, la représentation minimale de deux compléments du module aura toujours exactement le nombre de bits spécifié pour la longueur de la clé au moment de la création de clé . Donc, par exemple, si vous créez une touche 2048 bits, alors clés.getmodulus (). BitLength () retournera toujours 2048.)

Pardon, mais pas Key.getModulus (). BitLength () renvoie une valeur incorrecte lorsque le bit le plus significatif du module est un 0? Par exemple, pour une touche 2048 bits, si le bit le plus significatif du module est 0, alors clé.getmodulus (). BitLength () retournera 2047 (ou moins si plus de bits sont 0) . Je penserais que le résultat souhaité dans un tel cas serait réellement 2048.

la documentation pour biginteger.ballength () se lit comme suit:

retourne le nombre de bits dans la représentation minimale de deux compléments de cette BigInteger, à l'exclusion d'un pit-signal. Pour les bigintegers positifs, cela équivaut au nombre de bits dans la représentation binaire ordinaire. (Calcules (CEIL (log2 (ceci <0? -C'est-ce: ceci + 1))).)

J'ai bien peur que l'on doive faire des hypothèses sur les tailles de la clé. Vous devrez supposer, par exemple, que vous ne verrez jamais des clés 1024, 2048 ou 4096 bits, puis faites quelque chose comme: xxx

Ce code peut toujours Soyez faux sur l'occasion (très rare), par exemple, lorsque les 1048 premiers bits d'une touche 2048 bit sont tous 0. Je pense que ce n'est pas quelque chose à craindre, cependant.


5 commentaires

Ce code est faux à chaque occasion. Key.getModulus (). BitLength () est la valeur définie par la "taille de la clé" ou "longueur de la clé". Le remplacer par des valeurs choisi arbitraires est un problème clair.


Oleg, tu as raison, bien sûr. J'ai ajouté la modification pour expliquer mon malentendu sur les restrictions sur les principaux facteurs qui entrent dans la génération de la clé.


Si toujours paranoïaque sur des générateurs de clés mochettes, on peut utiliser l'arrondissement: Keysize = ((BitLength + 127) / 128) * 128. Mieux que deviner. Et la chance de hautes 128 bits étant tous les zéros est, bien, de l'ordre de 1 sur 2 ^ 128.


Malheureusement, il y a des cas interopers où la sélection d'une puissance de deux est nécessaire. Si vous essayez d'importer une clé publique générée par Java dans .NET et utilisez-la pour chiffrer les données, elle ne déchiffrera pas en Java, à moins que la longueur de la clé correspond aux attentes. Si vous avez généré une clé de 2048 bits, vous ne pouvez pas donner une touche .NET une clé avec 2040 bits (8 meubles de zéros dans le boîtier de clé) ou 2052 bits (si vous tournez la biginteger en une chaîne hexagonale, vous pouvez obtenir un 0) supplémentaire 0). Vous devez lui donner exactement 2048 bits. Cela ne cause pas toujours d'erreur, mais cela affecte les schémas de rembourrage OAEP.


Comme expliqué dans Stackoverflow.com/Questtions/11729893/...



1
votes

Je partage les préoccupations de Wheezil mentionnées dans la réponse acceptée. Un module avec 8 morts 0-bits va briser l'approche. Cela a une chance de se produire de 0,4%, ce qui est inacceptable à mon avis. Donc, j'utilise personnellement cela à la place:

Cipher rsa = Cipher.getInstance("RSA");
rsa.init(Cipher.ENCRYPT_MODE, yourKey);
int keyBitSize = rsa.getOutputSize(0) * Byte.SIZE;


0 commentaires