这是this SO post的后续,我学会了生成RSA密钥对并将公钥存储在设置中。我通过以下方式生成了我的密钥:
CspParameters cspParams = new CspParameters();
cspParams.KeyContainerName = "XML_ENC_RSA_KEY";
RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider(cspParams);
string keyXml = rsaKey.ToXmlString(true);
我将该字符串的公钥部分复制到我的程序设置中,它看起来像:
"<RSAKeyValue><Modulus>mfXS3Na0XfkjhpjS3sL5XcC9o+j6KXi1LB9yBc4SsTMo1Yk/pFsXr74gNj4aRxKB45+hZH/lSo933NCDEh25du1iMsaH4TGQNkCqi+HDLQjOrdXMMNmaQrLXGlY7UCCfFUnkEUxX51AlyVLzqLycaAt6zm5ljnDXojMC7JoCrTM=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>"
这看起来有效吗?
然后我正在获取XML文档并尝试将其转换为加密函数的byte []:
string fileName = System.IO.Path.Combine(Application.StartupPath, "alphaService.xml");
XDocument doc = new XDocument();
XElement xml = new XElement("Info",
new XElement("DatabaseServerName", txtServerName.Text),
new XElement("DatabaseUserName", txtDatabaseUserName.Text),
new XElement("DatabasePassword", txtDatabasePassword.Text),
new XElement("ServiceAccount", txtAccount.Text),
new XElement("ServicePassword", txtServicePassword.Text),
new XElement("RegistrationCode", txtRegistrationCode.Text));
doc.Add(xml);
doc.Save(fileName);
// Convert XML doc to byte stream
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(fileName);
byte[] fileBytes = Encoding.Default.GetBytes(xmlDoc.OuterXml);
Encrypt(fileBytes);
我从加密功能获得“语法错误line1”,即:
private static byte[] Encrypt(byte[] bytes)
{
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
rsa.FromXmlString(Properties.Settings.Default.PublicKeyXml);
return rsa.Encrypt(bytes, true);
}
}
有什么想法吗?编辑:实际错误是:
rsa.FromXmlString(Properties.Settings.Default.PublicKeyXml);
答案 0 :(得分:1)
我只是在这里查看你的帖子,寻找有关RSACryptoServiceProvider的信息。我尝试了你的代码,它对我有用,嗯,有点,我从来没有得到你做的错误,直到我再次开始阅读你的消息。
从Properties.Settings中删除公钥中的引号。当我看到您为公钥发布的内容时,我进入并将引号添加到我的字符串中,我得到了与您完全相同的错误。
我确实遇到了错误,但与您的错误不同,加密时出现错误的长度错误。但是,我发现如果我将用于转换XmL的行更改为.ToString()而不是.OuterXML,则它可以正常工作。
private void button4_Click(object sender, EventArgs e)
{
string fileName = System.IO.Path.Combine(Application.StartupPath, "alphaService.xml");
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(fileName);
byte[] fileBytes = Encoding.ASCII.GetBytes(xmlDoc.ToString());
byte[] EncryptedBytes = Encrypt(fileBytes);
string EncryptedString = Encoding.ASCII.GetString(EncryptedBytes);
}
private static byte[] Encrypt(byte[] bytes)
{
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
rsa.FromXmlString(Properties.Settings.Default.PublicKeyXml);
return rsa.Encrypt(bytes, false);
}
}
我更改并编码为ASCII,因此我可以将字节数组转换为字符串,如果使用相同的方法转换为字节数组,最好这样做。