簡體   English   中英

C#RSA解密問題

[英]C# RSA Decryption issue

我具有用於解密在我的開發機上正常工作的值的函數。 但是當在另一台服務器上的生產環境中運行時-給出此確切的錯誤消息:

該系統找不到指定的文件。

這是函數:

 public static string Decrypt(string stringToDecrypt, string key)
    {
        string result = null;

        if (string.IsNullOrEmpty(stringToDecrypt))
        {
            throw new ArgumentException("An empty string value cannot be encrypted.");
        }

        if (string.IsNullOrEmpty(key))
        {
            throw new ArgumentException("Cannot decrypt using an empty key. Please supply a decryption key.");
        }

        try
        {
            System.Security.Cryptography.CspParameters cspp = new System.Security.Cryptography.CspParameters();
            cspp.KeyContainerName = key;

            System.Security.Cryptography.RSACryptoServiceProvider rsa = new System.Security.Cryptography.RSACryptoServiceProvider(cspp);
            rsa.PersistKeyInCsp = true;

            string[] decryptArray = stringToDecrypt.Split(new string[] { "-" }, StringSplitOptions.None);
            byte[] decryptByteArray = Array.ConvertAll<string, byte>(decryptArray, (s => Convert.ToByte(byte.Parse(s, System.Globalization.NumberStyles.HexNumber))));


            byte[] bytes = rsa.Decrypt(decryptByteArray, true);

            result = System.Text.UTF8Encoding.UTF8.GetString(bytes);

        }
        finally
        {
            // no need for further processing
        }

        return result;
    }

更新資料

伙計們,我本來是走這條路的,因為經過數小時的搜索,我得到了關於stackoverflow的答案,這種加密/解密方法完全適用於字符串,而無需導入/導出密鑰。

所以....現在我缺少密鑰文件? 我什至沒有創建密鑰文件,這怎么可能。

請注意,您不是將key參數用作密碼,而是用作容器的名稱 這依賴於較早存儲密鑰的加密功能。 不適合在計算機之間傳輸加密數據。 除非您也轉讓鑰匙。

如果您需要將密鑰從一台計算機復制到另一台計算機,則必須從密鑰容器中將其導出。 我們發現rsaCryptoServiceProvider.ImportCspBlobExportCspBlob方法可以很好地解決此問題。 您將獲得一個單字節數組,然后可以將其轉換為Convert.ToBase64StringConvert.FromBase64String

當然,它必須是可導出密鑰(或者更好的是,僅導出公共密鑰,這是PKC的工作方式,因此一端具有私有密鑰,而另一端只有公共密鑰)。 不可導出密鑰只能導出其公共密鑰。 一旦系統正常運行,您就可以在需要私鑰駐留的位置創建一個新的不可導出密鑰,並導出公鑰以將其傳輸到其他需要加密的地方,以加密該單個收件人。

另外,您需要確保在完成后Dispose加密提供程序(顯然, Clear()不夠好)。 如果在一個本地范圍內使用using語句,或者可以在finally塊中使用using語句,則最好使用using語句。 請注意,它顯式實現了IDisposable ,因此您必須在一個單獨的語句中將其轉換為IDisposable有點尷尬。 using語句處理轉換本身,因此更容易。

使用Sysinternals.com的FileMon可以查看正在尋找的文件?

我的猜測是cspp.KeyContainerName = key; 是相關行。

好吧,您是否將密鑰安裝在服務器上加密提供程序中名為key的容器中? 請參閱如何:使用X.509證書管理工具

順便說一句,如果您能夠在計算機上解密應在服務器上作為私鑰的東西,則該密鑰已被破壞。 您應該盡快更改密鑰。

更新后

RSA密碼術基於非對稱密鑰。 您使用公共密鑰加密,而目標密鑰使用私鑰加密。 密鑰是預先提供的,您的目的地將生成或獲取密鑰對,並將私有部分保留給自己,並為其他用戶宣傳公共部分。 通常,密鑰被打包為X509證書,因為這利用了圍繞證書的整個信任基礎結構(簽名,可信機構,證書目的等)。 在那種情況下,消息的目的地必須向受信任的機構(例如,Verisign)等請求用於加密目的的證書。或者使用自簽名證書(makecert.exe),並通過某些帶外方法建立信任(例如,電話驗證證書哈希或IssuerName / SerialNumber)。

RSa加密與“僅字符串”相距遠。 對稱密鑰密碼學(AES,DES,XDES,RC4)更接近“僅字符串”,其中您的應用程序具有用於加密和解密的秘密密鑰。

現在,除非您真的知道自己在做什么,否則請避免使用加密,請使用現成的協議,例如SSL / TLS (在線)或S-MIME (離線)。 更好的是,使用一些框架工具,例如CryptoStreamProtectedData 不要根據從未遇見的人的新聞組建議創建另一個偽加密...

問題可能在於RSA對象嘗試在用戶配置文件中創建CryptoContainer。
您可以嘗試添加以下內容:

rsa.UseMachineKeyStore = true;

暫無
暫無

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

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