2010-06-25 5 views
2

Tout d'abord, ce n'est pas une faute de frappe, je veux Décrypter en utilisant une clé publique . Le but de cette opération est de mettre en cause une tierce partie pour s'assurer qu'elle possède effectivement la clé privée correspondant à la clé publique. Fondamentalement, je voudrais envoyer des données aléatoires, ils le chiffreraient avec leur clé privée, je le décrypterait en utilisant la clé publique et comparerais la valeur déchiffrée aux données aléatoires que j'ai envoyées. Je crois que c'est une procédure assez standard dans la cryptographie à clé publique, mais pour une raison quelconque, décrypter avec une clé publique semble être un tabou.données Décrypter en utilisant une clé publique RSA

J'utilise simplement le RSACryptoServiceProvider dans .NET 2.0. Cependant, quand j'appelle Decrypt il lance un CryptographicException avec le message Bad Key. La clé n'est pas mauvaise (je peux Encrypt sans problème), mais il me semble qu'elle ne me laissera pas déchiffrer avec juste la clé publique. Ce qui donne? Cela doit être possible de faire.

Répondre

7

Je pense que le terme reconnu est signé. Ils signent avec la clé privée, et vous vérifier avec la clé publique. J'avoue que je ne comprends pas les mathématiques de bas niveau aussi bien que je devrais, mais ma compréhension est de signer est vraiment tout simplement le cryptage avec la clé privée.

Utilisez signe de RSACryptoServiceProvider et de vérifier la famille des méthodes. En fait, SignHash dit réellement, "le crypter avec la clé privée."

+0

* "mais ma compréhension est en train de signer est vraiment juste de chiffrer avec la clé privée" * - Eh bien, oui et non. Oui en théorie. En pratique cependant, vous devez d'abord hacher l'entrée, crypter le * hash * avec la clé privée et l'ajouter au message, car RSA est très coûteux en termes de calcul. En fait, lorsque vous cryptez en pratique, vous ne cryptez même pas l'entrée avec la clé publique: vous cryptez un grand nombre aléatoire et utilisez ce nombre comme clé d'un algorithme de cryptage symétrique beaucoup plus rapide, comme AES. –

+1

@BlueRaja, j'étais en fait conscient de cela (le hachage et que RSA est seulement utilisé pour l'échange d'une clé de session aléatoire). Cela fait partie des raisons pour lesquelles j'ai fait référence à 'SignHash'. Mon point est que "signature x" == "chiffrer x avec une clé privée." Cela s'applique indépendamment du fait que x est un hachage ou un message réel. –

+1

La principale différence entre la signature et le cryptage est que lorsque vous * cryptez *, vous remplissez des données aléatoires (pour éviter les attaques de devinettes en clair); lorsque vous signez *, vous remplissez les données qui ont une structure prédéfinie (pour éviter les attaques restées). Lorsque vous vérifiez une signature, il est important de vérifier que les données de remplissage sont également correctes. – caf

0

Ces classes .Net doivent être un wrapper de l'API crypto.

Il existe deux types de clés dans l'API crypto. Crypto API est un wrapper autour de PKCS # 11. Lorsque vous générez une paire de clés à l'aide du fournisseur de services de chiffrement Microsoft, vous obtenez les clés AT_EXCHANGE AND AT_SIGNATURE. Chaque clé est générée en fonction des attributs définis dans PKCS#11 norme ..

touches AT_EXCHANGE Attributs:

wrap/déroulez = true

signe/vérifier = true

Crypter/décrypter = false

Touches AT_SIGNATURE Attributs:

wrap/déballez = false

signe/vérifier = true

Crypter/décrypter = false

Donc, fondamentalement, quand vous les données exchaning, vous êtes essentiellement la réalisation d'une enveloppe/fonction Déballer. C'est ce que Microsoft appelle AT_EXCHANGE. Ceci est principalement utilisé pour échanger des clés secrètes/symétriques et non utilisées pour échanger d'énormes quantités de données.

Vous devez revenir en arrière et savoir quelle clé choisie soit signe/envelopper votre dat.

+0

Je ne suis pas tout à fait sûr que je suis ... Je suis ne pas faire la signature, je suis simplement en train de vérifier la signature. Même alors, tout ce que je veux vraiment faire est de déchiffrer certaines données. D'après ce que je comprends de ce que vous dites, cela ne semble pas possible avec l'API .NET? – Dennis

+0

Je ne comprends pas votre commentaire. Vous dites >> J'essaie simplement de vérifier la signature. << MAIS VOUS ÊTES ÉGALEMENT DISANT, >> Je veux vraiment faire est déchiffrer des données << Voulez-vous simplement déchiffrer des données ou voulez-vous vérifier la signature? ou voulez-vous faire les deux ?, Si c'est le troisième choix, alors regardez les modèles hybrides [http://en.wikipedia.org/wiki/Hybrid_cryptosystem]. – Raj

+0

J'ai un tas d'octets que j'essaie de décrypter RSA en utilisant RSACryptoServiceProvider et tout ce que j'ai est la clé publique. Les termes "signature" et "hash" ne font qu'obscurcir mon objectif. – Dennis

0

par Raj, la clé que vous avez fourni avec est probablement pas marqué pour l'échange.

Demandez la partie qui a fourni la clé publique la façon dont ils ont généré. Si vous utilisez makecert.exe, ils devront spécifier "-Sky Exchange". Sans cela, vous ne pouvez utiliser que la clé pour la signature et l'authentification, et non le chiffrement/décryptage, qui est le cas d'utilisation que vous implémentez ici.

Questions connexes