[英]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.ImportCspBlob
和ExportCspBlob
方法可以很好地解決此問題。 您將獲得一個單字節數組,然后可以將其轉換為Convert.ToBase64String
和Convert.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 (離線)。 更好的是,使用一些框架工具,例如CryptoStream或ProtectedData 。 不要根據從未遇見的人的新聞組建議創建另一個偽加密...
問題可能在於RSA對象嘗試在用戶配置文件中創建CryptoContainer。
您可以嘗試添加以下內容:
rsa.UseMachineKeyStore = true;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.