RSACryptoServiceProvider initialiser avec sa propre clé publique et la clé privée
Je suis en train d'initialiser RSACryptoServiceProvider avec mes propres clés publique et privée.
Aussi loin que je pouvais la recherche, la façon de le faire est d'appeler le constructeur
RSACryptoServiceProvider RSAalg = new RSACryptoServiceProvider(cspParams);
cspParams comme indiqué ci-dessus. Cependant, quand je regarde la msdn exemple sur l'utilisation de celui-ci:
http://msdn.microsoft.com/en-us/library/ca5htw4f.aspx
Je ne vois pas l'endroit où ils ont mis le privé ou le public touches. Uniquement à l'aide d'un KeyContainer. Lorsque je crée un RSACryptoServiceProvider sans cspParam, il est par défaut à utiliser uniquement une clé Publique. J'ai remarqué cela quand j'ai vérifier le PublicOnly variable sur la classe elle-même et il est en lecture seule variable.
Ma question est comment puis-je initialiser cette classe puis de définir mes propres clés privées et publiques.
Le serveur sera à l'aide de la clé privée et le client est la clé publique.
Que j'ai trouvé est que la création d'un RSAParameter objet et définition de l' .Exposant et .Le module paramètres, comme le public et le privé variables respectivement.
Mais je suis un Manquant"Clé Privée" erreur, puisque je crois que le RSACryptoServiceProvider n'est pas initialisé avec le bon constructeur.
Ci-dessous est une partie de mon code. Ne vous inquiétez pas à propos de BigInteger la classe, c'est juste une expérience. Même si je l'utilise ou pas, je reçois le même message d'erreur.
//Create a UnicodeEncoder to convert between byte array and string.
UnicodeEncoding ByteConverter = new UnicodeEncoding();
byte[] dataToEncrypt = ByteConverter.GetBytes(password);
byte[] encryptedData;
byte[] decryptedData;
//RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
RSAParameters rsap = new RSAParameters();
BigInteger n = new BigInteger("19579160939939334264971282204525611731944172893619019759209712156289528980860378672033164235760825723282900348193871051950190013953658941960463089031452404364269503721476236241284015792700835264262839734314564696723261501877759107784604657504350348081273959965406686529089170062268136253938904906635532824296510859016002105655690559115059267476786307037941751235763572931501055146976797606538425089134251611194500570922973015579287289778637105402129208324300035518642730384616767241853993887666288072512402523498267733725021939287517009966986976768028023180137546958580922532786773172365428677544232641888174470601681", 10);
BigInteger e = new BigInteger("65537", 10);
//rsap.Modulus = ByteConverter.GetBytes(publicKey);
rsap.Exponent = e.getBytes();
rsap.Modulus = n.getBytes();
/*rsap.Exponent = ByteConverter.GetBytes(publicKey);
rsap.D = ByteConverter.GetBytes(publicKey);
rsap.DP = ByteConverter.GetBytes(publicKey);
rsap.DQ = ByteConverter.GetBytes(publicKey);
rsap.P = ByteConverter.GetBytes(publicKey);
rsap.Q = ByteConverter.GetBytes(publicKey);
rsap.InverseQ = ByteConverter.GetBytes(publicKey);*/
using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider())
{
//RSA.PublicOnly = false;
RSA.ImportParameters(rsap);
Debug.Log ("PublicOnly: " + RSA.PublicOnly);
Debug.Log (rsap.Modulus.Length);
//Debug.Log (RSA.ToString());
//Pass the data to ENCRYPT, the public key information
//(using RSACryptoServiceProvider.ExportParameters(false),
//and a boolean flag specifying no OAEP padding.
//encryptedData = RSACSPSample.RSAEncrypt(dataToEncrypt, rsap, false);
encryptedData = RSACSPSample.RSAEncrypt(dataToEncrypt, RSA.ExportParameters(false), false);
Debug.Log ("encryptedData: " + encryptedData);
//Display the decrypted plaintext to the console.
//Debug.Log("Decrypted plaintext: " + ByteConverter.GetString(""));
//Pass the data to DECRYPT, the private key information
//(using RSACryptoServiceProvider.ExportParameters(true),
//and a boolean flag specifying no OAEP padding.
decryptedData = RSACSPSample.RSADecrypt(encryptedData, RSA.ExportParameters(true), false);
}
//encryptedData = RSACSPSample.RSAEncrypt(dataToEncrypt, rsap, false);
//if (encryptedData != null) {
password = ByteConverter.GetString(decryptedData);
//}
Alors, comment puis-je configurer la clé publique de l'RSAParameter alors? J'ai déjà ma clé publique, dois juste régler le RSAParameter objet afin que je puisse l'utiliser.
Dépend si vous avez une publique et une clé privée à utiliser, si non, alors vous pouvez utiliser CSPParams pour créer une paire.
- Je faire, pouvez-vous me dire comment les utiliser?
laissez-nous continuer cette discussion dans le chat
OriginalL'auteur c1pherB1t | 2012-11-30
Vous devez vous connecter pour publier un commentaire.
Les champs sont horriblement nommé et il est source de confusion. Le
Exponent
champ est vraiment le public l'exposant d'une clé publique. Le privé l'exposant d'une clé privée est laD
champ.Il n'est pas de votre faute que la documentation MSDN suce.
Maintenant, je vais avoir un manque d'élasticité de l'erreur. Aucune idée de ce que cela signifie? Ou ce que j'ai besoin de configurer le Module variable? Est-ce à dire je n'ai pas besoin de l'initialiser avec cspParams?
Le module est ... le module. Si vous regardez une
RSAParameters
la structure de votre clé publique RSA seulement le Module et l'Exposant domaines, mais le RSA privée a tous les champs.Je n'ai pas fini de faire ce que je devais faire de cette manière (j'ai utilisé Château Gonflable), mais vous aviez raison. Et j'ai réussi à faire chiffrer et déchiffrer juste avec RSACryptoServiceProvider de msdn.
OriginalL'auteur James K Polk
Vous devez les convertir en base 64:
OriginalL'auteur user5507004