C#rsacyptoserviceprovider ToXmlString()/FromXmlString()
编辑2: 似乎Convert.FromBase64String是我的救星。有人知道这样的字符串中是否有逗号吗?我正在做基本的csv解析。如果是的话,我总是可以使用引号(但我想引号也可以是这样的字符串),但这对我来说只是一个小项目,所以用“,”拆分更容易解析 编辑: 好的,我的问题似乎是当我将加密的字节转换成字符串,然后将该字符串转换回要解密的字节。我如何做到这一点,因为我想将加密字符串存储在某个地方,并能够解密该字符串 我正试图将公钥(以及仅用于测试的私钥)保存到xml文件中,以便以后可以读取相同的密钥,但在尝试解密时会出现“坏数据”错误。有人能看出我做错了什么吗C#rsacyptoserviceprovider ToXmlString()/FromXmlString(),c#,encryption,character-encoding,cryptography,rsacryptoserviceprovider,C#,Encryption,Character Encoding,Cryptography,Rsacryptoserviceprovider,编辑2: 似乎Convert.FromBase64String是我的救星。有人知道这样的字符串中是否有逗号吗?我正在做基本的csv解析。如果是的话,我总是可以使用引号(但我想引号也可以是这样的字符串),但这对我来说只是一个小项目,所以用“,”拆分更容易解析 编辑: 好的,我的问题似乎是当我将加密的字节转换成字符串,然后将该字符串转换回要解密的字节。我如何做到这一点,因为我想将加密字符串存储在某个地方,并能够解密该字符串 我正试图将公钥(以及仅用于测试的私钥)保存到xml文件中,以便以后可以读取相
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);
}
}
}这与您的公钥/私钥处理无关(我认为这部分看起来还可以,但文件I/O可以更轻松地完成) 但是,将加密数据作为字符串传输的方式不适合“往返”。改用Base64编码
您应该能够在调试器中看到这一点:记下
encryptedData
的长度和第一个字节,这应该与Decrypt方法中的d
匹配 第二次编辑的答案是否,base64字符串仅使用字母数字字符和“+”、“/”和“=”
了解更多信息不要通过字符串编码来回发送密文-这里值得一提。