web-dev-qa-db-fra.com

Quelle est la différence entre le cryptage et la signature en cryptage asymétrique?

Quelle est la différence entre chiffrer certaines données et les signer (en utilisant 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 puisse être l'expéditeur. Je veux que ma clé publique soit utilisée pour lire les messages et je me fiche de savoir qui les lit. Je souhaite pouvoir chiffrer certaines informations et les utiliser comme clé de produit pour mon logiciel. Je tiens seulement à ce que je sois le seul à pouvoir en générer. J'aimerais inclure ma clé publique dans mon logiciel pour déchiffrer/lire la signature de la clé. Je me fiche de savoir qui peut lire les données dans la clé, je me soucie seulement de savoir si je suis le seul à pouvoir le générer.

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

239
mmcdole

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 elle est vraiment la vôtre.

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

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

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

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

Je tiens seulement à ce que je sois le seul à pouvoir en générer.

Si vous avez seulement besoin de le savoir vous-même, vous n'avez pas besoin de manipuler 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é.

J'aimerais inclure ma clé publique dans mon logiciel pour déchiffrer/lire la signature de la clé.

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

364
Quassnoi

Dans RSA crypto, lorsque vous générez une paire de clés, le choix de la clé publique et de la clé privée est totalement arbitraire. 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 chiffrer un message avec la clé publique du destinataire, afin que le destinataire puisse le déchiffrer avec sa clé privée.

Une signature est la preuve que le signataire a la clé privée qui correspond à une clé publique. Pour ce faire, il suffirait de chiffrer le message avec le clé privée de l'expéditeur et d'inclure la version chiffrée à côté de la version en texte brut. Pour vérifier l'expéditeur, décryptez 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 quand ils le font, ils ont prouvé que le créateur du texte chiffré possède la clé privée correspondante.

Toutefois, cela signifie que vous devez doubler la taille de votre transmission - texte en clair et texte chiffré (en supposant que vous souhaitiez que les personnes qui ne sont pas intéressées par la vérification de la signature lisent le message). Donc, à la place, une signature est créée en créant un hash du texte en clair. Il est important que les 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, chiffrez-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.
108
slim

Ouais, penser à signer des données en leur donnant votre propre cachet de cire que personne d'autre n'a. Il est fait pour atteindre intégrité et non-répudiation . Le cryptage est tel que personne ne peut voir les données. Ceci est fait pour atteindre la confidentialité . Voir wikipedia http://en.wikipedia.org/wiki/Information_security#Key_concepts

Une signature est un hachage de votre message signé avec votre clé privée.

19
Johnno Nolan

La signature produit un "hash" avec votre clé privée qui peut être vérifiée avec votre clé publique. Le texte est envoyé en clair.

Le chiffrement utilise la clé publique du destinataire pour chiffrer 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!).

15
Doug Currie

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

  1. Cryptez les données afin que seules les personnes autorisées puissent les déchiffrer et les lire.
  2. Vérifier 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 à Bob un message 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 en utilisant sa clé privée.

Notez que si A veut envoyer un message à B, A doit utiliser la clé publique de B (accessible à tous) et ni la clé publique ni la clé privée de A n'entre en image ici.

Donc, si vous voulez m'envoyer un message, vous devez connaître et utiliser la clé publique que je vous ai communiquée et je suis le seul à pouvoir décrypter 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 à nouveau envoyer un message à Bob. Le problème du 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 parviens pas à déchiffrer et à lire le message original envoyé par Alice (qui nécessite un accès à la clé privée de Bob), je pirate la totalité de la conversation entre eux.

Y a-t-il un moyen pour Bob de confirmer que les messages qu'il reçoit sont réellement 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. Puisque la clé publique d'Alice a correctement vérifié le message, Bob peut conclure que le message a été signé par Alice.
13
Siva Prakash

Signer indique que vous êtes vraiment la source ou le répondant de l'objet signé. Tout le monde peut lire l'objet, cependant.

Le chiffrement signifie que seuls les détenteurs de la clé privée correspondante peuvent le lire, mais sans signer, rien ne garantit que vous êtes derrière l'objet chiffré.

8
rjamestaylor

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 de chiffrer) des messages arbitraires fournis par d'autres personnes - cela permet d'attaquer les algorithmes qui pourraient compromettre vos clés.

6
Michael Borgwardt

Dans votre scénario, vous ne cryptez pas au sens de cryptage asymétrique; Je préférerais l'appeler "encoder".

Donc, vous encodez vos données dans une représentation binaire, puis vous vous connectez 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 ne sont pas significatives)

3
devio

Quelle est la différence entre chiffrer certaines données et les signer (en utilisant 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é pourrait l'avoir signé. 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. Utilisation des mêmes clés privées pour la signature et le déchiffrement (ou, de la même manière, les mêmes clés publiques pour la vérification et le cryptage ) est mal vu, vous ne devez pas mélanger les objectifs. Ce n’est pas tant un problème mathématique (RSA devrait toujours être sécurisé), mais un problème de gestion des clés , par exemple. la clé de signature doit avoir une durée de vie plus courte et contenir plus de protection avant son utilisation.

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 destinataire pour le chiffrement. Généralement, signature-alors-chiffrement est utilisé, sinon un adversaire pourrait remplacer la signature par la sienne. De même, vous devez utiliser la clé privée du destinataire 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 signatures n'utilise pas "le cryptage avec la clé privée". Bien que toutes les opérations RSA soient basées sur une exponentiation modulaire, le schéma de remplissage est totalement différent pour la génération de signature. De plus, la clé publique a des propriétés totalement 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 puisse être 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 savoir 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, ne les chiffrez pas.

La signature n'influencera généralement pas le contenu du message. Le message est considéré séparé des signatures. Officiellement, ces signatures sont appelées "signatures avec appendice", l'appendice étant 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) du message; ils ne sont plus très 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 incluant à la fois le message et la signature. Dans ce cas, vous devez d'abord extraire le message du conteneur, toujours non chiffré, un peu comme si vous décompressez un fichier à partir d'une archive .Zip pure. Le message peut donc être masqué et ne peut pas être utilisé directement dans ce cas.

Je souhaite pouvoir chiffrer certaines informations et les utiliser comme clé de produit pour mon logiciel. Je tiens seulement à ce que je sois le seul à pouvoir en 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 "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 signatures.

J'aimerais inclure ma clé publique dans mon logiciel pour déchiffrer/lire la signature de la clé. Je me fiche de savoir qui peut lire les données dans la clé, je me soucie seulement de savoir si je suis le seul à pouvoir le générer.

Oui, cela s'appelle établir 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 Microsoft Authenticode par exemple. Les magasins d'applications tels que iStore et Android app store peuvent utiliser ou non la signature de code, mais ils peuvent rassurer que votre application n'est pas clonée ou du moins pas clonée dans le magasin. La cryptographie n'est pas toujours la solution après tout.

Il est beaucoup plus difficile d'empêcher que votre code soit cloné/modifié , et vous seriez solidement en territoire de DRM si vous procédiez de la sorte.

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

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

2
Maarten Bodewes

Sur le plan fonctionnel, vous utilisez le chiffrement à clé publique/privée pour vous assurer que seul le destinataire peut lire votre message. Le message est crypté puis crypté à l'aide de la clé publique du destinataire.

La signature que vous utilisez permet au destinataire de savoir que vous avez créé le message et qu'il n'a pas changé pendant le transfert. La signature du message est effectuée à l'aide de votre propre clé privée.

Pour ce qui est de l'algorithme utilisé: cela implique des nombres premiers. Je ferais une recherche sur Google pour une meilleure explication.

2
Gerbrand

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

  1. Aucune tierce partie 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é logicielle n'est pas lisible par l'homme

Une signature numérique résoudra ce problème car les données brutes permettant de créer la clé peuvent être signées avec une clé privée, ce qui la rend non lisible par l'homme mais peut être décodée si elle est gérée de manière inverse. Mais la clé privée est sûre, ce qui signifie que personne ne sera en mesure de créer des licences pour votre logiciel (ce qui est le but).

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

Python La documentation PyNaCl contient un exemple de 'Signature numérique' qui ira dans ce sens. http://pynacl.readthedocs.org/en/latest/signing/

et de cause projet NaCl à C exemples

1
oden