簡體   English   中英

RSA加密Xml文件轉換為byte []時出錯

[英]Error with RSA Encrypting Xml file converted into byte[]

這是該SO帖子的后續文章,在該文章中,我學會了生成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文檔並嘗試將其轉換為Encrypt函數的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);

我從Encrypt函數獲取“語法錯誤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);

我只是在這里查看您的帖子,以查找有關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,因此可以將字節數組轉換為字符串,如果使用相同的方法轉換為字節數組,則最好這樣做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM