我希望你能帮助我解决我在尝试使用RSA为我的加密类型实现QueryString加密模块时遇到的一个奇怪的错误。我的问题是2折:
背景/重要信息:
我创建了一个名为QueryString的对象,它存储在会话中(并使用SessionID生成密钥/ salt)。我在Session Start上实例化它,它会生成密钥,它自然会在Session.Abandon上死掉......我在我的BasePage中检索它并在我的页面后面使用它很像我会用普通的查询字符串(QueryString [key] for gets和东西)...我将公钥和私钥存储在对象本身中,作为对象的内部属性。
另一个重要的事情是我的网站有很多网格,其中包含链接的记录行,所以它们都必须在设置之前加密(href = ...)...所以我创建的QueryString对象可以非常快速地征税(使用OnRowCreated循环或者加密hrefs的东西)。
错误:
我正在尝试间歇性错误,当我尝试加密或解密时,无法再现(它们随机发生...相信我......非常随机),以下类型:
错误类型1:CreateProvHandle
错误类型2:找不到指定的文件。
错误类型3:尝试执行未经授权的操作。
对于错误1和2,我设法通过简单地递归调用导致它的方法(加密或解密)来处理它,并且它们通常只递归一次(最大我使用我的指标是3)和错误神奇地消失了...所以我把它归咎于过多的对象本身或其他东西的电话......但如果有人知道为什么会发生这种情况或如何解决这个问题,我很乐意接受从我的方法中递归并在发生重大异常时真正抛出。最重要的是,我告诉我的RSA参数不要在CSP商店中保留任何东西,所以我认为文件的内容并不重要,但显然不是......
对于错误3,我根本无法理解它!我的RSA参数说不要在CSP中保留任何内容,所以我不知道它甚至会尝试访问文件的方式,时间或原因(是的,我正在重复自己!),更不用说受限制的文件或者用户不会无法访问?请帮帮我!!
这里是我的RSA参数的一些代码...也许你会发现那些与我正在尝试做的事情不相符的事情(在对象实例化时生成一次密钥,将对象存储在会话中,以及从那一点开始使用/断开任何远程/调用不属于站点或.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);
}
答案 0 :(得分:0)
啊是的......愚蠢的错误(不是他们总是吗?):
Normal Class
Static Crypto Class
End Static
End Normal
你能找到问题以及我遇到碰撞错误的原因吗?我已经将静态变为正常状态,而且一切都在我的脖子上。
干杯!