web-dev-qa-db-fra.com

Puis-je utiliser une clé privée comme clé publique et vice versa?

J'ai du code pour crypter les données à l'aide d'une clé publique et les décrypter à l'aide d'une clé privée. Ceci est utile lorsqu'un client souhaite envoyer des données à un serveur et sait que seul le serveur peut les décrypter.

Mais disons que je veux que le serveur crypte les données en utilisant la clé privé et les décrypte en utilisant la clé public, comme un moyen de distribuer des données qui peuvent être vérifiées comme provenant de la bon serveur. Plutôt que de modifier le code pour permettre cela, puis-je simplement publier la clé privée et garder la clé publique secrète? Cela affecte-t-il la sécurité du système?

39
Graeme Perrow

Mais disons que je veux que le serveur crypte les données en utilisant la clé privée et les décrypte en utilisant la clé publique, comme un moyen de distribuer des données qui peuvent être vérifiées comme provenant du bon serveur.

Vous pouvez le faire - c'est, à un niveau très simpliste, comment fonctionne la signature RSA (remarque, simpliste - il y a un peu plus).

Plutôt que de modifier le code pour permettre cela, puis-je simplement publier la clé privée et garder la clé publique secrète? Cela affecte-t-il la sécurité du système?

Vous n'avez pas besoin de publier la clé privée du tout - RSA est une permutation Trapdoor qui signifie:

  • Si vous chiffrez avec une clé publique, vous pouvez déchiffrer avec la clé privée.
  • Si vous chiffrez avec une clé privée, vous pouvez déchiffrer avec une clé publique.

Ainsi, RSA prend en charge la signature et le chiffrement en se basant sur le fait que l'utilisateur final ne possède que la clé publique.

Dans votre cas, si le client souhaite vérifier que les données proviennent du serveur, vous appliquez le deuxième cas de RSA et déchiffrez les données de signature à l'aide de la clé publique que vous avez déjà.

De plus, comme il s'agit d'une permutation, vous ne devriez pas du tout avoir à modifier votre code. Les deux touches doivent fonctionner en utilisant la même fonction. Je m'attendrais à ce que toute bibliothèque de crypto décente ait des API pour vérifier les signatures selon les normes variables qui existent - l'une d'entre elles serait probablement un bon pari.

RSA Labs fournit un Nice explication de cela .

Si vous souhaitez étendre cela entre les serveurs ou vérifier la communication client - générez des clés pour chaque entité et échangez les clés publiques. Le processus peut ensuite être utilisé aux deux extrémités.

Théoriquement parlant, e et d sont interchangeables (c'est pourquoi RSA fonctionne) (on doit être désigné secret et gardé secret) mais p et q doivent toujours être gardé secret car ceux-ci vous permettent de dériver d de e et vice versa. Cependant, vous devez être extrêmement prudent dans votre compréhension de la clé privée - votre logiciel stocke-t-il p/q dans la clé privée? Si c'est le cas, vous ne pouvez pas le publier tel quel. Aussi, quand je dis interchangeable - une fois que vous publiez l'un de ces couples (e ou d avec votre module n), vous devez garder l'autre avec votre vie. Pratiquement parlant comme Graeme lié à dans les commentaires e est souvent choisi comme une valeur petite/fixe. Mon commentaire sur e/d étant interchangeable ne s'applique clairement pas lorsque e est facilement déterminé. Faire ce genre de choses a donc le potentiel de confusion et de mauvaise mise en œuvre. Utilisez une bibliothèque tierce/ne commencez pas à publier des clés privées.

51
user2213

Oui, vous pouvez crypter en utilisant une clé privée et décrypter en utilisant une clé publique, ne remettez PAS votre clé privée (les clés privées peuvent générer des clés publiques, et votre système de cryptage entier est maintenant inutile), je suppose que vous voulez faire quelque chose comme cette:

Le serveur crypte les données, les envoie aux clients.

Les clients ont une clé publique et peuvent décrypter les données du serveur.

Dans cette circonstance, il serait logique que si le serveur effectue à la fois le chiffrement et le déchiffrement, je ne sais pas pourquoi vous voudriez une implémentation de chiffrement asymétrique.

Cependant, la règle s'applique toujours: la clé privée reste privée et ne quitte pas le serveur.

9
StrangeWill

Mais disons que je veux que le serveur crypte les données en utilisant la clé privée et les décrypte en utilisant la clé publique:

Le serveur peut crypter les données en utilisant sa clé privée et le récepteur peut décrypter en utilisant les clés publiques du serveur, c'est possible. Cependant, ce scénario est utilisé pour signer numériquement un document et comme vous le dites "c'est un moyen de distribuer des données qui peuvent être vérifiées comme provenant du bon serveur", car seule la clé correspondante (clé publique du serveur) pourrait être utilisée pour décrypter les données. La clé publique du serveur est vérifiée par le certificat numérique correspondant généré et signé numériquement par le serveur.

puis-je simplement publier la clé privée et garder la clé publique secrète?

Vous ne devez jamais publier la clé privée, comme son nom l'indique.

Cela affecte-t-il la sécurité du système?

Oui, ce système n'est pas non plus viable, par exemple, si vous utilisez Diffie-Hellman (l'un des protocoles d'échange de clés les plus utilisés), le serveur et tous les clients doivent partager des valeurs publiques, qui sont utilisées pour calculer les clés de session . Donc, si vous en tant qu'utilisateur publiez votre clé privée, il est très facile de calculer la clé publique, ce qui n'est pas possible ou très difficile dans l'autre sens.

2
Ishtiaq Hussain

Je ne sais pas si vous pourriez crypter avec la clé privée et décrypter avec la clé publique, mais si vous le pouviez, alors ce ne serait pas très sécurisé, car la clé de décryptage est publique - votre clé privée devrait rester privée.

Si vous souhaitez simplement vérifier que l'expéditeur du message, vous signez plutôt les données à l'aide de la clé privée de l'expéditeur et le destinataire vérifie la signature à l'aide de la clé publique de l'expéditeur.

Si vous souhaitez à la fois crypter les données et vérifier l'expéditeur, vous cryptez et signez, aucune des deux ne nécessitant d'exposer la clé privée.

0
hmallett