Quelle est la différence entre chiffrer et signer avec un chiffrement asymétrique?


297

Quelle est la différence entre le chiffrement de certaines données et la signature de certaines données (à l'aide de RSA)?

Cela inverse-t-il simplement le rôle des clés publiques-privées?

Par exemple, je veux utiliser ma clé privée pour générer des messages afin que je ne puisse être que l'expéditeur. Je veux que ma clé publique soit utilisée pour lire les messages et je me fiche de qui les lit. Je souhaite pouvoir crypter certaines informations et les utiliser comme clé de produit pour mon logiciel. Je me soucie seulement d'être la seule à pouvoir les générer. Je voudrais inclure ma clé publique dans mon logiciel pour décrypter / lire la signature de la clé. Peu m'importe qui peut lire les données dans la clé, je me soucie seulement d'être la seule personne vérifiable qui puisse les générer.

La signature est-elle utile dans ce scénario?

Réponses:


441

Lors du cryptage, vous utilisez leur clé publique pour écrire un message et ils utilisent leur clé privée pour le lire.

Lors de la signature, vous utilisez votre clé privée pour écrire la signature du message et ils utilisent votre clé publique pour vérifier si c'est vraiment la vôtre.

Je veux utiliser ma clé privée pour générer des messages afin que je ne puisse être que l'expéditeur.

Je veux que ma clé publique soit utilisée pour lire les messages et je me fiche de qui les lit

C'est la signature , c'est fait avec votre clé privée.

Je veux pouvoir crypter certaines informations et les utiliser comme clé de produit pour mon logiciel.

Je me soucie seulement d'être la seule à pouvoir les générer.

Si vous avez seulement besoin de le savoir par vous-même, vous n'avez pas besoin de jouer avec les clés pour le faire. Vous pouvez simplement générer des données aléatoires et les conserver dans une base de données.

Mais si vous voulez que les gens sachent que les clés sont vraiment les vôtres, vous devez générer des données aléatoires, y conserver une base de données ET la signer avec votre clé.

Je voudrais inclure ma clé publique dans mon logiciel pour décrypter / lire la signature de la clé.

Vous devrez probablement acheter un certificat pour votre clé publique auprès d'un fournisseur commercial comme Verisign ou Thawte, afin que les gens puissent vérifier que personne n'a falsifié votre logiciel et remplacé votre clé publique par la leur.


7
Techniquement parlant, lorsque vous dites que la clé privée est utilisée pour écrire la signature du message, vous dites que le hachage du message est crypté avec ma clé privée?
Andy Ibanez

4
@AndyIbanez: ce qui est chiffré (le résumé ) peut également inclure un horodatage et du sel aléatoire, mais oui, c'est l'essentiel.
Quassnoi

7
@Quassnoi En fait, lorsque nous disons «signer avec la clé privée», cela signifie non pas «chiffrer», mais plutôt «déchiffrer». Signer le message en gros est la même chose que déchiffrer avec la clé privée et dans le récepteur chiffrer avec la clé publique, de cette façon le hachage deviendra le même et pourrait être comparé.
Johnny Willer

5
@JohnnyWiller: comme @slim mentionné ci-dessous, le noyau mathématique est le même pour les fonctions de cryptage et de décryptage. Ce ne sont pas des fonctions distinctes, ce sont les mêmes fonctions f(key, message), telles quef(private, f(public, message)) === f(public, f(private, message)) === message
Quassnoi

2
@Honey non ce n'est pas. La génération de la paire de clés est gratuite. Le coût est impliqué pour faire croire aux autres que la signature est vraiment la vôtre. Pour ce faire, vous disposez de votre clé publique elle-même, que vous avez précédemment générée gratuitement, signée par une autorité qui pourrait ou non vous facturer de l'argent pour cela.
Quassnoi

143

Dans la cryptographie RSA, lorsque vous générez une paire de clés, il est tout à fait arbitraire lequel vous choisissez d'être la clé publique et quelle est la clé privée. Si vous chiffrez avec l'un, vous pouvez déchiffrer avec l'autre - cela fonctionne dans les deux sens.

Il est donc assez simple de voir comment vous pouvez crypter un message avec la clé publique du destinataire , afin que le destinataire puisse le décrypter avec sa clé privée .

Une signature est la preuve que le signataire possède la clé privée qui correspond à une clé publique. Pour ce faire, il suffirait de chiffrer le message avec la clé privée de cet expéditeur et d'inclure la version chiffrée à côté de la version en texte brut. Pour vérifier l'expéditeur, déchiffrez la version chiffrée et vérifiez qu'elle est identique au texte en clair.

Bien sûr, cela signifie que votre message n'est pas secret. Tout le monde peut le déchiffrer, car la clé publique est bien connue. Mais lorsqu'ils le font, ils ont prouvé que le créateur du texte chiffré possède la clé privée correspondante.

Cependant, cela signifie doubler la taille de votre transmission - texte en clair et texte chiffré ensemble (en supposant que vous voulez que les personnes qui ne souhaitent pas vérifier la signature lisent le message). Par conséquent, une signature est généralement créée en créant un hachage du texte en clair. Il est important que de faux hachages ne puissent pas être créés, donc des algorithmes de hachage cryptographiques tels que SHA-2 sont utilisés.

Alors:

  • Pour générer une signature, créez un hachage à partir du texte en clair, cryptez-le avec votre clé privée, incluez-le à côté du texte en clair.
  • Pour vérifier une signature, créez un hachage à partir du texte en clair, déchiffrez la signature avec la clé publique de l'expéditeur, vérifiez que les deux hachages sont identiques.

8
@headcode, il ne s'applique qu'aux clés asymétriques. Les clés symétriques ne viennent pas par paires.
slim

3
En fait, cela ne s'applique qu'aux clés RSA. Avec les clés ECDSA, par exemple, vous pouvez générer de manière triviale la clé publique à partir de la clé privée, et la clé privée est un scalaire tandis que la clé publique est une coordonnée.
David Schwartz

5
Comment décrypter des messages avec des clés PUBLIQUES? Les messages ne sont-ils pas décryptés uniquement avec des clés privées?
daremkd

3
5 sources contredisant cette réponse 1 , 2 , 3 , 4 , 5
wha7ever

6
Ce n'est pas arbitraire celui que vous appelez public et privé. Vous pouvez générer la clé publique à partir de la clé privée, mais vous ne pouvez pas générer la clé privée à partir de la clé publique. N'est-ce pas une grande différence?
Greg Schmit

24

L’établissement d’une communication sécurisée pose deux problèmes distincts mais étroitement liés

  1. Chiffrez les données afin que seules les personnes autorisées puissent les déchiffrer et les lire.
  2. Vérifiez l'identité / l'authentification de l'expéditeur.

Ces deux problèmes peuvent être résolus avec élégance en utilisant la cryptographie à clé publique.

I. Cryptage et décryptage des données

Alice veut envoyer un message à Bob que personne ne devrait pouvoir lire.

  • Alice crypte le message avec la clé publique de Bob et l'envoie.
  • Bob reçoit le message et le déchiffre à l'aide de sa clé privée.

Notez que si A veut envoyer un message à B, A doit utiliser la clé publique de B (qui est accessible au public à tous) et ni la clé publique ni la clé privée de A n'apparaissent ici.

Donc, si vous voulez m'envoyer un message, vous devez connaître et utiliser ma clé publique que je vous fournis et seulement je pourrai déchiffrer le message car je suis le seul à avoir accès à la clé privée correspondante.

II. Vérifier l'identité de l'expéditeur (authentification)

Alice veut envoyer à nouveau un message à Bob. Le problème de cryptage des données est résolu en utilisant la méthode ci-dessus.

Mais que se passe-t-il si je suis assis entre Alice et Bob, me présentant comme «Alice» à Bob et envoyant mon propre message à Bob au lieu de transmettre celui envoyé par Alice. Même si je ne peux pas décrypter et lire le message d'origine envoyé par Alice (qui nécessite l'accès à la clé privée de Bob), je détourne l'intégralité de la conversation entre eux.

Existe-t-il un moyen pour Bob de confirmer que les messages qu'il reçoit sont bien envoyés par Alice?

  • Alice signe le message avec sa clé privée et l'envoie. (En pratique, ce qui est signé est un hachage du message, par exemple SHA-256 ou SHA-512.)
  • Bob le reçoit et le vérifie à l'aide de la clé publique d'Alice. Étant donné que la clé publique d'Alice a correctement vérifié le message, Bob peut conclure que le message a été signé par Alice.

1
Donc, lorsque vous signez le message, signez-vous le message lui-même ou le message crypté?
FrostyStraw

21

Oui, pensez à signer des données comme à lui donner votre propre tampon de cire que personne d'autre n'a. Cela est fait pour atteindre l' intégrité et la non-répudiation . Le cryptage permet à personne d'autre de voir les données. Ceci est fait pour assurer la confidentialité . Voir wikipedia http://en.wikipedia.org/wiki/Information_security#Key_concepts

Une signature est un hachage de votre message signé à l'aide de votre clé privée.


16

La signature génère un "hachage" avec votre clé privée qui peut être vérifié avec votre clé publique. Le texte est envoyé en clair.

Le cryptage utilise la clé publique du récepteur pour crypter les données; le décodage se fait avec leur clé privée.

Ainsi, l'utilisation des clés n'est pas inversée (sinon votre clé privée ne serait plus privée!).


Dans le chiffrement asymétrique normal, le chiffrement est effectué avec la clé publique du destinataire, pas avec votre clé privée.
mmcdole

Avez-vous manqué que cette question concerne spécifiquement RSA où l'utilisation des clés est inversée et où elle ne compromet pas la clé privée.
David Schwartz

8

Vous décrivez exactement comment et pourquoi la signature est utilisée dans la cryptographie à clé publique. Notez qu'il est très dangereux de signer (ou chiffrer) des messages arbitraires fournis par d'autres - cela permet des attaques sur les algorithmes qui pourraient compromettre vos clés.


1
Les navigateurs Web ne chiffrent-ils pas des données arbitraires lors de l'utilisation de SSL?
Ian Warburton

2
@IanWarburton: Mais ils n'utilisent pas de cryptage asymétrique pour cela. Les transferts de données réels utilisent un cryptage symétrique avec une clé de session générée aléatoirement.
Michael Borgwardt

1
@IanWarburton: non, car ni l'un ni l'autre ne serait choisi par un attaquant. Le danger réside dans le chiffrement ou la signature de quelque chose directement fourni par un attaquant, car cela peut être délibérément conçu pour révéler des informations sur votre clé privée, ou même créer des signatures qui semblent valides pour quelque chose que vous n'aviez pas l'intention de signer. Une ventilation détaillée du fonctionnement de ce dernier cas pour RSA est ici: crypto.stackexchange.com/questions/35644/…
Michael Borgwardt

2
@IanWarburton: c'est pourquoi RSA nécessite un remplissage, donc vous ne cryptez jamais seulement un message choisi: en.wikipedia.org/wiki/… - mais ce sont vraiment les opérations qui impliquent la clé privée (comme la signature) qui sont particulièrement vulnérables à l'entrée choisie.
Michael Borgwardt

1
@IanWarburton Je ne suis pas un expert en cryptographie, mais d'après ce que je comprends, cela ne devrait pas poser de problème.
Michael Borgwardt,

8

La signature indique que vous êtes vraiment la source ou le garant de l'objet signé. Tout le monde peut cependant lire l'objet.

Le chiffrement signifie que seuls ceux qui ont la clé privée correspondante peuvent le lire, mais sans signer, il n'y a aucune garantie que vous êtes derrière l'objet chiffré.


Si le message est déchiffré par ma clé publique, alors seulement je pourrais l'avoir envoyé. (En supposant que ma clé privée n'est pas compromise)
Dojo

5

Quelle est la différence entre le chiffrement de certaines données et la signature de certaines données (à l'aide de RSA)?

Le chiffrement préserve la confidentialité du message ("certaines données"), tandis que la signature assure la non-répudiation: c'est-à-dire que seule l'entité qui l'a signé aurait pu le signer. Il existe également des différences fonctionnelles; continuer à lire.

Cela inverse-t-il simplement le rôle des clés publiques-privées?

Absolument pas. L'utilisation des mêmes clés privées pour la signature et le décryptage (ou, de même, les mêmes clés publiques pour la vérification et le cryptage ) est mal vue, car vous ne devez pas mélanger les fins. Ce n'est pas tant un problème mathématique (RSA devrait toujours être sécurisé), mais un problème avec la gestion des clés , où par exemple la clé de signature devrait avoir une durée de vie plus courte et contenir plus de protection avant d'être utilisée.

Pour le même message, vous devez utiliser la clé privée de l'expéditeur pour la signature et la clé publique de confiance du récepteur pour le chiffrement. Généralement, signer-puis-crypter est utilisé, sinon un adversaire pourrait remplacer la signature par la sienne. De même, vous devez utiliser la clé privée du récepteur pour le déchiffrement et la clé publique de confiance de l'expéditeur pour la vérification.

De plus, vous devez comprendre que la génération de signature n'utilise pas le "chiffrement avec la clé privée". Bien que toutes les opérations RSA soient basées sur l'exponentiation modulaire, le schéma de remplissage est entièrement différent pour la génération de signature. En outre, la clé publique a des propriétés entièrement différentes de la clé privée RSA dans toutes les utilisations pratiques de RSA.

Par exemple, je veux utiliser ma clé privée pour générer des messages afin que je ne puisse être que l'expéditeur.

C'est une propriété de non-répudiation, qui peut être obtenue en signant.

Je veux que ma clé publique soit utilisée pour lire les messages et je me fiche de qui les lit.

La clé publique doit être considérée comme connue de tous. Si vous voulez que tout le monde lise les messages, vous ne les chiffrez tout simplement pas.

La signature n'influencera généralement pas le contenu du message. Le message est considéré comme distinct des signatures. Officiellement, ces signatures sont appelées «signatures avec appendice» où l'appendice est le message. C'est un nom un peu bizarre car le message est considéré comme plus important que la signature dessus, mais oui. Seules quelques signatures offrent une récupération (partielle) des messages; ils ne sont plus beaucoup utilisés et sont généralement considérés comme obsolètes.

Notez que les protocoles de signature tels que CMS peuvent déployer un format de conteneur qui inclut à la fois le message et la signature. Dans ce cas, vous devez d'abord extraire le message - toujours non chiffré - du conteneur, un peu comme décompresser un fichier d'une archive .zip ordinaire. Le message peut donc être masqué et ne peut pas être utilisé directement dans ce cas.

Je souhaite pouvoir crypter certaines informations et les utiliser comme clé de produit pour mon logiciel. Je me soucie seulement d'être la seule à pouvoir les générer.

Le cryptage est utilisé pour assurer la confidentialité. Dans le passé, la génération de signatures RSA était souvent considérée comme un "chiffrement avec la clé privée". Cependant, les opérations sont assez différentes, comme expliqué ci-dessus, et les normes ultérieures tentent désespérément de séparer le cryptage et la génération de signature.

Je voudrais inclure ma clé publique dans mon logiciel pour décrypter / lire la signature de la clé. Peu m'importe qui peut lire les données dans la clé, je me soucie seulement d'être la seule personne vérifiable qui puisse les générer.

Oui, cela s'appelle établir la confiance dans la clé publique. Cependant, la protection de votre code de programme est très différente de la protection des messages. Vous pouvez effectuer la signature de code, mais vous aurez alors besoin de quelque chose pour vérifier la signature en dehors de votre code . Il existe des systèmes d'exploitation qui offrent cela.

Il y a par exemple Microsoft Authenticode. Les magasins d'applications comme iStore et Android app store peuvent ou non utiliser la signature de code, mais ils offrent une certaine assurance que votre application n'est pas clonée ou du moins pas clonée dans la boutique. La cryptographie n'est pas toujours la solution après tout.

Garder votre code d'être cloné / modifié du tout est beaucoup plus difficile, et vous seriez solidement en territoire DRM si vous allez de cette façon.

La signature est-elle utile dans ce scénario?

Oui absolument. Cela peut certainement aider à vous assurer que les messages n'ont été signés que par vous, s'il y a confiance dans la clé publique. S'il peut être utile pour authentifier votre code d'application / clé publique intégrée dépend entièrement de l'environnement dans lequel vous prévoyez d'exécuter le code.


"Dans le passé, la génération de signature RSA était souvent considérée comme un" cryptage avec la clé privée ". Cependant, les opérations sont assez différentes, comme expliqué ci-dessus, et les normes ultérieures tentent désespérément de séparer le cryptage et la génération de signature." - ce n'est pas clair pour moi. Soit KeyPair peut être le pk ou sk et ce que l'un crypte l'autre peut décrypter. Si nous sommes d'accord là-dessus, comment pouvons-nous affirmer que la signature et le chiffrement sont distincts de manière significative? Les deux chiffrent, puis ne peuvent être déchiffrés qu'avec l'autre clé. J'ai vu des références à des fonctions de signature, est-ce lié?
Morgan

La seule différence que je connaisse dans la fonction de signature est le hachage du message avant le cryptage.
Morgan

4

Dans votre scénario, vous ne chiffrez pas au sens du chiffrement asymétrique; Je préfère l'appeler "encoder".

Vous codez donc vos données en une représentation binaire, puis vous signez avec votre clé privée. Si vous ne pouvez pas vérifier la signature via votre clé publique, vous savez que les données signées ne sont pas générées avec votre clé privée. ("vérification" signifie que les données non signées n'ont pas de sens)


2

Fonctionnellement, vous utilisez le cryptage à clé publique / privée pour vous assurer que seul le destinataire peut lire votre message. Le message est chiffré à l'aide de la clé publique du récepteur et déchiffré à l'aide de la clé privée du récepteur.

La signature que vous pouvez utiliser pour informer le destinataire que vous avez créé le message et qu'il n'a pas changé pendant le transfert. La signature des messages se fait à l'aide de votre propre clé privée. Le récepteur peut utiliser votre clé publique pour vérifier que le message n'a pas été falsifié.

Quant à l'algorithme utilisé: qui implique une fonction unidirectionnelle voir par exemple wikipedia . L'un des premiers de ces algorithmes utilise de grands nombres premiers mais plus de fonctions unidirectionnelles ont été inventées depuis.

Recherchez «Bob», «Alice» et «Mallory» pour trouver des articles d'introduction sur Internet.


Pouvez-vous commenter mon cas d'utilisation? Je veux utiliser une clé privée pour crypter et une clé publique pour permettre à tout le monde de décrypter.
mmcdole

1
Ce n'est pas vrai que tout le cryptage asymétrique est basé sur des nombres premiers, c'est juste l'exemple le plus connu (RSA); il existe d'autres méthodes telles que la cryptographie à courbe elliptique.
Michael Borgwardt

"Le message est crypté puis crypté à l'aide de la clé publique du récepteur." Cette phrase n'a tout simplement aucun sens, ou à tout le moins, elle a besoin d'explications supplémentaires. "crypté puis crypté" ???
Maarten Bodewes

Tu as oublié Trent! :)
Dojo

1

Répondant à cette question dans le contenu que l'intention des intervenants était d'utiliser la solution pour l'octroi de licences logicielles, les exigences sont les suivantes:

  1. Aucun tiers ne peut produire une clé de licence à partir de la décompilation de l'application
  2. Le contenu de la clé logicielle n'a pas besoin d'être sécurisé
  3. La clé du logiciel n'est pas lisible par l'homme

Une signature numérique résoudra ce problème car les données brutes qui font la clé peuvent être signées avec une clé privée qui la rend non lisible par l'homme mais pourrait être décodée si elle est rétroconçue. Mais la clé privée est sûre, ce qui signifie que personne ne pourra faire de licences pour votre logiciel (ce qui est important).

N'oubliez pas que vous ne pouvez pas empêcher une personne qualifiée de supprimer les verrous logiciels de votre produit. Donc, s'ils doivent pirater chaque version publiée. Mais vous ne voulez vraiment pas qu'ils puissent générer de nouvelles clés pour votre produit qui peuvent être partagées pour toutes les versions.

Python La documentation PyNaCl contient un exemple de «signature numérique» qui répondra à cet objectif. http://pynacl.readthedocs.org/en/latest/signing/

et de la cause du projet NaCl aux exemples C

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.