gpt4 book ai didi

C# RSACryptoServiceProvider ToXmlString()/FromXmlString() 方法

转载 作者:太空狗 更新时间:2023-10-29 20:42:14 24 4
gpt4 key购买 nike

编辑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 匹配。

关于C# RSACryptoServiceProvider ToXmlString()/FromXmlString() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6735793/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com