C# RSACryptoServiceProvider ToXmlString()/FromXmlString()
EDIT2:
Semble Convertir.FromBase64String est mon sauveur. Personne ne sait si une virgule aurait tous être dans une telle chaîne? Je suis en train de faire csv de l'analyse. Si c'est que je peux toujours utiliser les guillemets (mais peut-cite jamais être dans une chaîne comme celle-ci aussi, je suppose), mais c'est juste un petit projet pour moi donc, juste plus facile à analyser par fractionnement par des ','.
EDIT:
OK, donc il semblerait que mon problème est quand je convertir chiffrées octets d'une chaîne de caractères, puis de convertir cette chaîne d'octets à être déchiffré. Comment pourrais-je faire cela parce que je veux stocker la chaîne cryptée quelque part et d'être capable de déchiffrer cette chaîne.
Je suis en train d'enregistrer la clé publique (et privée juste pour le test) dans un fichier xml pour que je puisse lire la même dans le plus tard, mais l'obtention de "Mauvais" données de l'erreur en essayant de le décrypter. N'importe qui peut voir ce que je fais mal?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;
using System.IO;
namespace EncryptionTest
{
class Program
{
static void Main(string[] args)
{
UnicodeEncoding ByteConverter = new UnicodeEncoding();
byte[] dataToEncrypt = ByteConverter.GetBytes("Test data");
WriteRSAInfoToFile();
string enc = Encrypt(dataToEncrypt);
enc = Decrypt(enc);
}
static void WriteRSAInfoToFile()
{
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
TextWriter writer = new StreamWriter("C:\\publicKey.xml");
string publicKey = RSA.ToXmlString(false);
writer.Write(publicKey);
writer.Close();
writer = new StreamWriter("C:\\privateKey.xml");
string privateKey = RSA.ToXmlString(true);
writer.Write(privateKey);
writer.Close();
}
static string Encrypt(byte[] data)
{
UnicodeEncoding ByteConverter = new UnicodeEncoding();
RSACryptoServiceProvider encrypt = new RSACryptoServiceProvider();
TextReader reader = new StreamReader("C:\\publicKey.xml");
string publicKey = reader.ReadToEnd();
reader.Close();
encrypt.FromXmlString(publicKey);
byte[] encryptedData = encrypt.Encrypt(data, false);
return ByteConverter.GetString(encryptedData);
}
static string Decrypt(string data)
{
UnicodeEncoding ByteConverter = new UnicodeEncoding();
RSACryptoServiceProvider decrypt = new RSACryptoServiceProvider();
TextReader reader = new StreamReader("C:\\privateKey.xml");
string privateKey = reader.ReadToEnd();
reader.Close();
decrypt.FromXmlString(privateKey);
byte[] d = ByteConverter.GetBytes(data);
byte[] decryptedData = decrypt.Decrypt(d, false); //ERROR: bad data
return ByteConverter.GetString(decryptedData);
}
}
}
OriginalL'auteur user441521 | 2011-07-18
Vous devez vous connecter pour publier un commentaire.
Cela n'a rien à voir avec votre clé publique/clé privée de la manipulation (je pense que la partie semble OK, le fichier I/O peut être fait plus facilement, bien que).
Mais votre façon de transporter les données chiffrées comme une chaîne de caractères n'est pas adapté pour "aller-retour" . Utiliser un encodage Base64 à la place.
Vous devriez être capable de voir dans le débogueur: notez la longueur et les premiers octets de
encryptedData
et il doit correspondre àd
dans le Déchiffrer méthode.Ne pas Aller-retour texte Chiffré Par l'intermédiaire d'une Chaîne de Codage - blogs.msdn.com/b/shawnfa/archive/2005/11/10/491431.aspx quelque chose de la peine de le mentionner ici.
OriginalL'auteur Henk Holterman
La réponse à votre deuxième édition est non, base64 chaînes utilise uniquement des caractères alpha numériques, et "+", "/" et "=".
En savoir plus ici
OriginalL'auteur Rodney