RSA加密会导致错误

时间:2013-03-28 00:38:11

标签: c# .net rsa

我希望你能帮助我解决我在尝试使用RSA为我的加密类型实现QueryString加密模块时遇到的一个奇怪的错误。我的问题是2折:

  1. 你能帮我解决我得到的错误吗?
  2. 您是否建议使用RSA之外的其他内容来加密QueryString?
  3. 背景/重要信息:
    我创建了一个名为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);
        }
    

1 个答案:

答案 0 :(得分:0)

啊是的......愚蠢的错误(不是他们总是吗?):

Normal Class
    Static Crypto Class
    End Static
End Normal

你能找到问题以及我遇到碰撞错误的原因吗?我已经将静态变为正常状态,而且一切都在我的脖子上。

干杯!