Chiffrement à clé publique avec RSACryptoServiceProvider
J'ai été sur un article sur CodeProject un pendant un certain temps, qui explique comment le chiffrer et déchiffrer à l'aide du RSA fournisseur de:
Alors que l'ancienne version de 2009 a été buggy, la nouvelle version 2012 (avec le Système.Numerics.BigInteger de soutien) semble plus fiable. Ce que cette version manque est bien un moyen de chiffrer avec un public clé et décrypter à l'aide de la privé clé.
Donc, j'ai essayé moi-même, mais à obtenir des ordures quand j'déchiffrer. Je ne suis pas familier avec le RSA fournisseur, donc je suis dans le noir ici. Il est difficile de trouver plus d'informations sur la façon dont cela est censé fonctionner.
Personne ne voir ce qui est mal à cela?
Ce qui suit est le Chiffrement avec une clé PUBLIQUE:
//Add 4 byte padding to the data, and convert to BigInteger struct
BigInteger numData = GetBig( AddPadding( data ) );
RSAParameters rsaParams = rsa.ExportParameters( false );
//BigInteger D = GetBig( rsaParams.D ); //only for private key
BigInteger Exponent = GetBig( rsaParams.Exponent );
BigInteger Modulus = GetBig( rsaParams.Modulus );
BigInteger encData = BigInteger.ModPow( numData, Exponent, Modulus );
return encData.ToByteArray();
Puis-je utiliser un grand "D" de la part du fournisseur quand je fais cela? Probablement pas, puisque c'est la clé publique qui n'ont pas de "D".
Alors la contrepartie (Décryptage à l'aide de la clé PRIVÉE):
BigInteger numEncData = new BigInteger( cipherData );
RSAParameters rsaParams = rsa.ExportParameters( true );
BigInteger D = GetBig( rsaParams.D );
//BigInteger Exponent = GetBig( rsaParams.Exponent );
BigInteger Modulus = GetBig( rsaParams.Modulus );
BigInteger decData = BigInteger.ModPow( numEncData, D, Modulus );
byte[] data = decData.ToByteArray();
byte[] result = new byte[ data.Length - 1 ];
Array.Copy( data, result, result.Length );
result = RemovePadding( result );
Array.Reverse( result );
return result;
Dois-je besoin d'un "D" ou l'Exposant ici?
Évidemment j'ai besoin de la crypto à travailler dans les deux sens privé-public, public-privé.
Toute aide est grandement appréciée!
OriginalL'auteur John | 2013-03-29
Vous devez vous connecter pour publier un commentaire.
voici un exemple pour vous:
euh ... il peut être un fait que vous ne pouvez pas déchiffrer avec la clé privée, lorsque vous n'avez pas ... oui...ce que cela a à faire avec un exemple de calcul qui montre juste comment faire les mathématiques derrière RSA?
Incorrecte, vous pouvez déchiffrer les données qui ont été chiffrées à l'aide de la clé privée à l'aide de la clé publique que dans le décrypter les processus. Votre exemple ci-dessus nécessite la clé privée, peu importe si le décryptage de l'aide publique ou privée pour le décryptage. Veuillez jeter un oeil à votre exemple, et vous comprendrez. Pour tous, vous avez besoin à la FOIS public et privé pour faire de votre décrypter les méthodes de travail, ce qui est faux.
Plus précisément
MyRSAParams.fromRSAParameters
recherche privés et publics de l'exposant. -- le D de la valeur.soupir ... ... donc, votre point est que le constructeur ne respecte pas les clés publiques? ...écrire votre propre ... c'est un exemple qui montre comment faire le calcul et la façon de lire les principaux composants ... non exemplaire gratuit&la production de pâte de code avec des garanties... hésitez pas à poster votre propre réponse ...
OriginalL'auteur DarkSquirrel42
Prendre cette encoder/décoder exemple
Dans le cas de RSA, il n'est pas nécessaire de déchiffrer avec la clé publique. À l'exception de vous dire rsa signature.
Non, je veux dire déchiffrer à l'aide de la clé publique. Par exemple, en php, en utilisant openssl_private_encrypt() -- le garder la clé privée PRIVÉE sur le serveur comme il se doit. Maintenant dans le "client", ce devrait être déchiffrée à l'aide de la clé publique (par exemple les clients serait un programme écrit en c# et "signé" avec AuthentiCode). Pratique d'avoir le public cert intégré dans le programme (partie du signe). Maintenant, cette image de l'autre --- échec épique. Et de se rouler un hachage que vous devez analyser pour "vérifier" les données --- si facilement piraté.
Je vais l'état de ce bien, ce n'est pas de votre faute que le reste du monde s'est fâché et se sent distribution de clés privées des applications client est la façon intelligente de faire-ou encore mieux, à l'aide de l'auto-signé clés privées sur le côté client et le stockage d'une tonne de clés publiques sur le serveur --- qui sont facilement imité, et sont 100% merde pour quoi que ce soit d'un réel sécurisé de la nature telles que les licences de logiciels.
Peut-être que ma réponse a été rapide. Je pense que RSACryptoServiceProvider a délibéré restriction pour éviter les erreurs possibles avec salle de chiffrer/public déchiffrer. Et pour la signature, nous pouvons utiliser SignData/VerifyData.
OriginalL'auteur Ivan Plyusnin