C#RSACryptoServiceProvider ToXmlString()/ FromXmlString()

EDIT2:
似乎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匹配.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...