Puis-je utiliser les ensembles PublicKey pour décrypter une chaîne cryptée avec le PrivateKey correspondant?

StackOverflow https://stackoverflow.com/questions/1847357

Question

La signature d'un assemblage .NET implique une paire de clés publique / privée. Pour autant que je peux dire ce que j'ai lu .NET utilise l'algorithme RSA et la clé privée pour signer l'assemblage, la vérification avec la clé publique intégrée.

Je sais comment récupérer la clé publique (Assembly.PublicKey). Je me demandais, si cette clé pourrait être utilisée pour déchiffrer une courte chaîne qui contient des données chiffrées avec la clé privée.

Les documents que j'ai lu jusqu'à présent ( par exemple ) semblent impliquer que seul l'autre sens est possible: que je dois utiliser la clé publique pour chiffrer et la clé privée pour décrypter - mais je ne veux pas vraiment inclure dans l'assemblée, faire I.

Je suppose que ce serait ok, si je viens de signer la chaîne. Mais comment?

Je suis un peu à perte comment commencer ce. Quelqu'un at-il un extrait de code?

En outre, le cryptage / signature de la petite chaîne serait idéalement se produire en PHP, puisque je veux délester que sur un serveur web et tout ce que nous avons à ce jour est votre site Web hébergé PHP / MySQL générique.

Cas d'utilisation : Je suis en train de trouver un système de licence pour un logiciel léger, nous sommes sur le point de libérer aux bêta-testeurs. Étant donné que le logiciel sera probablement freeware, tout ce que nous voulons vraiment atteindre est

  1. savoir qui a le logiciel installé (adresse e-mail)
  2. laissez le logiciel expire après une période donnée, après quoi l'utilisateur devra obtenir une nouvelle licence
    • c'est aussi facile que de remplir un formulaire et d'attendre un courriel automatisé avec la clé pour arriver
    • nous essayons de réduire la probabilité des anciennes versions à revenir à mordre notre réputation / nous hantent

Etre capable de chiffrer un tuple (date d'expiration, empreintes digitales) et décrypter qu'au démarrage ferait un module de licence facile: La première fois que l'application est lancée, l'utilisateur est invité à l'adresse e-mail, nom, organisation. Cette information est affichée sur le serveur Web avec une empreinte md5 de certaines informations système (nic, nom de l'ordinateur, l'assemblage majeur et version mineure). Les réponses du serveur web par e-mail (contrôles de validité de l'adresse e-mail) avec une version cryptée du tuple (date d'expiration, empreintes digitales) qui est ensuite sauvegardé sur le disque. Au démarrage, cela peut être déchiffré et par rapport à la date et l'empreinte régénérés.

EDIT : OK, donc je n'ai pas toutes les réponses à ma question encore. Mais il semble que .NET ne sera pas le rendre facile à utiliser la clé privée pour le chiffrement (si cela est possible, les réponses ne sont pas vraiment d'accord sur cela).

La route que je vais prendre est ce (basé sur mon cas d'utilisation):

  • Je vais utiliser la clé privée pour signer la licence.
  • Je vais utiliser la clé publique pour vérifier la licence a été signé par la clé privée
  • Je signalerai une autre question visant à devs PHP sur la façon d'utiliser les touches .NET (produit par sn.exe) pour signer un texte
  • Je ne suis pas vraiment inquiet pour l'utilisateur de voir la licence, car il est un hachage de toute façon et calculé à partir des choses qu'il sait allready. Tout ce que je veux est de rendre trop difficile d'être vaut pas la peine pour votre architecte bâtiment typique de copier mon logiciel sans me connaître (rappelez-vous, le logiciel sera gratuit - tout ce que je veux est un sentier de papier qui l'a installé ... )

Merci beaucoup pour vos réponses.

Était-ce utile?

La solution

Non .NET.

Dans de nombreux algorithme de chiffrement traditionnel clé publique, comme RSA, vous pouvez chiffrer et déchiffrer les deux sens, généralement d'une manière est appelée « cryptage » et l'autre « signature », même si vous finissez réellement avec une version cryptée de quelque chose dans les deux sens.

Cependant, dans la mise en œuvre .NET RSA a été estropiés, et lors de la signature ne produira que de l'entrée digests, pas la totalité des informations traitées.

Il semble qu'il y ait un certain désaccord sur ce qui peut et ne peut pas être fait avec RSA, alors laissez-moi modifier ma réponse pour être plus précis.

Je parle de mathématiques RSA, pas de mise en œuvre RSA particulier.

RSA mathématiques vous permet d'encoder des informations ou l'autre des deux clés (privées ou publiques), et les données codées ne peut être décodé avec l'autre des deux touches.

En règle générale, vous encodez avec une clé publique, chiffrer les informations et le décoder avec la clé privée, décrypter les informations. Ou, vous prenez un hachage des informations, encodez avec la clé privée, la signature du hachage, et décoder le hachage avec la clé publique, afin de comparer et vérifier la signature.

implémentations typiques ne permettent pas de faire plein codage des données du privé au public, uniquement en hachant les données, mais les mathématiques derrière RSA permet pleinement cette .

Autres conseils

Vous ne pouvez pas déchiffrer à l'aide de la clé publique. De cette façon, tout le point de « public » serait perdu.

(Vous pourriez toutefois être en mesure de signer quelque chose en utilisant la clé privée, puis vérifiez la signature en utilisant la clé publique est ce que le cadre utilise les touches pour -. L'ensemble est signé, et la clé publique est utilisée pour vérifier la signature.)

Cela peut être fait en utilisant SignedXml http://msdn.microsoft.com /en-us/library/ms229745.aspx. A un niveau plus bas que vous pouvez utiliser prob RSAPKCS1SignatureDeformatter et RSAPKCS1SignatureFormatter. Ceux-ci fonctionnent en chiffrant un hachage des données comparant alors les données avec la table de hachage (déchiffré), l'autre extrémité. Je crois que le hachage est utilisé parce que le chiffrement à clé privée ne peut traiter de petites données. Vous ne savez pas de réutiliser l'assemblage à clé publique, si elle est à l'origine des problèmes il suffit d'utiliser une paire de clés séparés.

Un mot d'avertissement, consultez ce que ces classes peut entraîner 20 secondes accrochages! http://www.pcreview.co.uk/forums/thread-3428177. php

Cette approche est vulnérable au code de vérification de signature étant falsifié en utilisant Reflexil mais qui est une autre affaire.

J'ai écrit ce qui suit, mais en relisant je pense que vous avez déjà obtenu ceci: Vous n'êtes pas vraiment essayer de chiffrer ou masquer les données de l'utilisateur, vous voulez les empêcher de créer ou d'altérer la licence. Vous avez raison qu'un algorithme de chiffrement à clé publique privée peut être utilisé pour cela. Ceci est connu comme Connexion à l'aide d'une clé privée (génération de licence côté serveur). Et la vérification de la signature en utilisant une clé publique (permis de vérifier dans l'application). Je mentionne cette terminologie comme ça vous aidera à la recherche.

Dans les clés publiques RSA sont utilisées pour le chiffrement, les clés privées sont utilisées pour le décryptage. Vous ne pouvez pas utiliser une clé publique pour déchiffrer quoi que ce soit ...

En RSA, la seule différence réelle entre une clé publique et une clé privée est celui que vous gardez le secret.

Vous pouvez utiliser une clé publique comme la clé de chiffrement et déchiffrement avec la clé privée, ou utiliser la clé privée comme la clé de chiffrement et déchiffrement avec la clé publique.

Encrypting avec la clé privée est utilisée pour les signatures numériques (tout le monde peut décoder avec la clé publique).

Mais comme @Lasse V. Karlsen a souligné, .Net pourrait faire que plus il doit être difficile ...

Je pense que les deux directions sont possibles avec le public Crypter et décrypter avec privée et encryptage clé privée. Le second est la façon dont le fonctionnement signature numérique.

Attention! Cette réponse est fausse, mais je vais le laisser ici cependant pas le moins parce que la série de commentaires ci-joints sont, je pense à un intérêt suffisant pour les autres pour maintenir la réponse autour. Ok, il me fait ressembler à un idiot mais c'est rien de nouveau pour moi,.) Vote que vous souhaitez

Une clé publique peut être utilisée pour: -

  • Chiffrer quelque chose qui ne peut être déchiffré avec la clé privée
  • Authentifier quelque chose signé avec la clé privée

Il ne peut pas être utilisé pour décrypter quelque chose à crypté par une clé privée. Son pour cette raison que le système de clé publique / privée est refered comme un système Asymétrique.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top