我希望你能帮我解决一个奇怪的错误,当我尝试使用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);
}