C# RSACryptoServiceProvider ToXmlString()/FromXmlString()

本文关键字:FromXmlString RSACryptoServiceProvider ToXmlString | 更新日期: 2023-09-27 18:02:20

EDIT2:看来Convert.FromBase64String是我的救星。有人知道这样的字符串中是否都会有逗号吗?我正在做基本的csv解析。如果是的话,我可以一直使用引号(但我想引号也可以在这样的字符串中(,但这对我自己来说只是一个小项目,所以通过","拆分更容易解析。

编辑:好吧,所以我的问题似乎是当我将加密的字节转换为字符串,然后将该字符串转换回要解密的字节时。我怎么能做到这一点,因为我想把加密的字符串存储在某个地方,并能够解密该字符串。

我正试图将公钥(和仅用于测试的私钥(保存到一个xml文件中,以便以后可以读取同一个文件,但在尝试解密时会出现"Bad data"错误。有人看到我做错了什么吗?

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);
    }
}

}

C# RSACryptoServiceProvider ToXmlString()/FromXmlString()

这与您的公钥/私钥处理无关(我认为这部分看起来还可以,不过文件I/O可以更容易地完成(。

但是,将加密数据作为字符串传输的方式不适合"往返"。请改用Base64编码。

您应该能够在调试器中看到这一点:记下encryptedData的长度和第一个字节,这应该与Decrypt方法中的d相匹配。

第二次编辑的答案是否定的,base64字符串只使用字母数字字符和"+"、"/"answers"="。

点击此处了解更多信息