我希望你能幫我解決一個奇怪的錯誤,當我嘗試使用RSA爲我的加密類型實現一個QueryString加密模塊時,我已經得到了一個奇怪的錯誤。我的問題是2倍:RSA加密導致錯誤
- 你能幫我解決我收到的錯誤嗎?
- 您是否推薦RSA以外的其他產品來加密QueryString?
背景/重要信息:
我創建稱爲查詢字符串的對象,這是我存儲在會話(和它使用的SessionID生成密鑰/鹽)。我在會話開始實例化它,它會生成密鑰,並且它會自然死在Session.Abandon上...我在BasePage中檢索它,並在後面的頁面中使用它,就像我正常的查詢字符串(QueryString [key] for gets和東西)...我將我的公鑰和私鑰存儲在對象本身中,作爲對象的內部屬性。
另一個重要的事情是,我的網站有很多網格,其中包含鏈接的記錄行,因此它們都必須在設置之前進行加密(href = ...)... so我創建的QueryString對象可能會相當快並且相當快(在使用OnRowCreated循環或用於加密hrefs時)。
錯誤(S):
目前我得到間歇性錯誤,這是不能被複制(它們發生在隨機......相信我......很隨意的),以下類型的,當我嘗試加密或解密:
錯誤類型1:CreateProvHandle 錯誤類型2:無法找到指定的文件。 錯誤類型3:試圖執行未經授權的操作。
對於錯誤1和錯誤2,我設法通過簡單遞歸調用導致它的方法(加密或解密)來處理它,它們通常只會遞歸一次(使用我的度量最大值爲3)這個錯誤神奇地消失了......所以我把太多的電話歸咎於對象本身或者其他東西......但是如果有人有任何線索知道爲什麼會發生這種情況或者如何解決這個問題,我很樂意接受遞歸出我的方法,並真正拋出一個重大異常時發生。最重要的是,我告訴我的RSA參數不要在CSP商店堅持任何東西,所以我認爲文件的事情並不重要,但顯然不是...
對於錯誤3,我根本無法得到我的頭!我的RSA參數表示不保留CSP中的任何內容,所以我不知道如何,何時甚至爲什麼它甚至會嘗試訪問文件(是的,我在重複自己!),更不用說受限制的文件或用戶不會無法訪問?請幫幫我!!
下面是我的RSA params的一些代碼...也許你會發現有些東西不與我想要做的事情一起工作(在對象實例化中生成一次鍵,將對象存儲在會話中,並從那一點開始使用/斷開任何遠程/調用服務器進程不屬於網站或.NET的一部分)?
public static void AssignParameter()
{
const int PROVIDER_RSA_FULL = 1;
const string CONTAINER_NAME = "ICareContainer";
CspParameters cspParams;
cspParams = new CspParameters(PROVIDER_RSA_FULL);
cspParams.KeyContainerName = CONTAINER_NAME;
cspParams.Flags = CspProviderFlags.UseMachineKeyStore;
cspParams.ProviderName = "Microsoft Strong Cryptographic Provider";
CryptoKeyAccessRule rule = new CryptoKeyAccessRule("everyone", CryptoKeyRights.FullControl, AccessControlType.Allow);
cspParams.CryptoKeySecurity = new CryptoKeySecurity();
cspParams.CryptoKeySecurity.SetAccessRule(rule);
rsa = new RSACryptoServiceProvider(cspParams);
rsa.PersistKeyInCsp = false;
rsa.KeySize = 1024;
}
public static string[] GetKeys()
{
AssignParameter();
string[] keys = new string[2];
//privatekey
keys[0] = rsa.ToXmlString(true);
//publickey
keys[1] = rsa.ToXmlString(false);
return keys;
}
public static string EncryptData(string data2Encrypt, string key)
{
AssignParameter();
string publicOnlyKeyXML = key;
rsa.FromXmlString(publicOnlyKeyXML);
//read plaintext, encrypt it to ciphertext
byte[] plainbytes = System.Text.Encoding.Default.GetBytes(data2Encrypt);
byte[] cipherbytes = rsa.Encrypt(plainbytes, false);
return Convert.ToBase64String(cipherbytes);
}
public static string DecryptData(string data2Decrypt, string key)
{
AssignParameter();
byte[] getpassword = Convert.FromBase64String(data2Decrypt);
string publicPrivateKeyXML = key;
rsa.FromXmlString(publicPrivateKeyXML);
//read ciphertext, decrypt it to plaintext
byte[] plain = rsa.Decrypt(getpassword, false);
return System.Text.Encoding.Default.GetString(plain);
}