0

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

  1. 你能帮我解决我遇到的错误吗?
  2. 您是否推荐 RSA 以外的其他方法来加密 QueryString?

背景/重要信息:
我创建了一个名为 QueryString 的对象,我将其存储在会话中(并使用 SessionID 生成密钥/盐)。我在生成密钥的 Session Start 上实例化它,然后它自然会在 Session.Abandon 上消失...和东西)...我将我的公钥和私钥存储在对象本身中,作为对象的内部属性。

另一个重要的事情是我的网站有很多网格,其中包含链接的记录行,因此它们都必须在设置之前加密(href = ...)......所以QueryString对象我created 可能会很快被征税(在使用 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);
    }
4

1 回答 1

0

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

Normal Class
    Static Crypto Class
    End Static
End Normal

你能找到问题吗?为什么我会遇到碰撞错误?我已将静态更改为正常,一切都很好。

干杯!

于 2013-03-28T14:07:25.260 回答