2017-10-18 23 views
1

Je suis un débutant en cryptographie, et probablement je pose une question stupide, mais je n'ai pas réussi à trouver une réponse à cette question. Je génère les clés RSA en Java dans un projet POC Android. Mon but est de crypter le mot de passe de l'utilisateur avec la clé publique et de le décrypter avec la clé privée du serveur, en m'appliquant cela permettra de conserver le mot de passe dans l'appareil de manière plus sécurisée (cryptée) L'authentification par empreinte digitale est utilisée. Je suis la génération des clés avec la méthode Java régulière:Généré RSA Modules de clé publique et privée sont les mêmes en Java/Android

KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); 
keyGen.initialize(1024); 
KeyPair key = keyGen.generateKeyPair(); 
PublicKey publicKey = key.getPublic(); 
PrivateKey privateKey = key.getPrivate(); 

Je Consigner les deux clés de l'Android Studio est Logcat cette façon:

Log.e(TAG, "Public key: " + publicKey); 
Log.e(TAG, "Private key: " + privateKey); 

... et voici ce que je reçois ouvert une session :

10-18 15:27:17.570 22426-22426/cliu.tutorialcrypto E/AsymmetricAlgorithmRSA: Public key: OpenSSLRSAPublicKey{modulus=c1312eb5c24da9577dd40263cec233b8be40ed227b81df3c442363f1dfd5364e9e2ba96d4dd7c1011d2633d6603beb1a483b75b8af8a87b10ebe918729b6afe95893d5c93b3f99727785110f2373d20ced8bfe2421c9c682ee737c60a7c6199be3d2e7e4687d69cedc50965b8cebc4445cdfe7a13a7df5eda6a6d4304d057505,publicExponent=10001} 
10-18 15:27:17.570 22426-22426/cliu.tutorialcrypto E/AsymmetricAlgorithmRSA: Private key: OpenSSLRSAPrivateCrtKey{modulus=c1312eb5c24da9577dd40263cec233b8be40ed227b81df3c442363f1dfd5364e9e2ba96d4dd7c1011d2633d6603beb1a483b75b8af8a87b10ebe918729b6afe95893d5c93b3f99727785110f2373d20ced8bfe2421c9c682ee737c60a7c6199be3d2e7e4687d69cedc50965b8cebc4445cdfe7a13a7df5eda6a6d4304d057505,publicExponent=10001} 

Question: Pourquoi les deux modules dans les clés générées sont-ils égaux? Je suppose que ce n'est pas assez sûr car avoir juste le module de clé publique quelqu'un pourrait facilement trouver la clé privée, non?

Répondre

2

Ce que vous générez est une clé paire pour Java. Les clés publiques et privées de la paire de clés partagent toujours le même module: les calculs sont effectués dans ce domaine. Ce qui est gardé sécurisé n'est pas le module mais l'exposant privé et - généralement aussi disponible - les paramètres requis pour effectuer l'exponentiation rapide en utilisant le théorème des restes chinois (CRT). Ce sont fondamentalement les paramètres tels que le premier P et Q utilisés pour calculer la clé privée et en effet le module.

En fait, vous pouvez utiliser le module pour déterminer que la clé paire est unique car chaque paire de clés doit avoir un module unique. De cette façon, vous pouvez également vérifier si la clé publique et la clé privée font partie de la même paire - sans faire de génération/vérification de signature.


L'exposant privé et les paramètres CRT ne sont bien sûr pas imprimés; le module est suffisant pour identifier la clé privée et vous ne voudriez pas détruire la sécurité de la clé privée en l'imprimant.

Si vous voulez les voir de toute façon, alors cast votre clé privée à RSAPrivateCrtKey et utilisez les getters de cette classe.

Notez que seules les clés logicielles recevront probablement des informations de retour des getters, sachez donc qu'en essayant d'accéder aux paramètres privés, vous devrez peut-être gérer les exceptions d'exécution.