2013-03-28 3 views
0

내 암호화 유형에 대해 RSA를 사용하여 QueryString 암호화 모듈을 구현하려고 시도하면서 이상한 오류가 발생하면 도와 주시면 좋겠습니다. 제 질문은 2 배입니다 :RSA 암호화로 인해 오류가 발생합니다.

  1. 내가 겪고있는 오류를 해결할 수 있습니까?
  2. QueryString을 암호화하기 위해 RSA 이외의 것을 권장합니까?

배경/중요 정보 :
나는 (키/소금을 생성하는 세션 ID를 사용하고) 내가 세션에 저장 QueryString을라는 개체를 만들었습니다. 세션 시작, 키를 생성하는 인스턴스화하고 그것은 자연스럽게 Session.Abandon에 죽는다 ... 나는 내 BasePage에서 검색하고 내 페이지 afterword에서 그것을 사용하는 것처럼 나는 일반적인 querystring (QueryString [key] for gets 그리고 물건) ... 나는 개체의 내부 속성으로 개체 자체에 공용 및 개인 키를 저장합니다.

또 다른 중요한 점은 내 웹 사이트에는 링크가 포함 된 레코드 열이있는 그리드가 많기 때문에 설정되기 전에 모두 암호화되어야한다는 것입니다 (href = ...) ... so 내가 만든 QueryString 객체는 꽤 빠르게 (꽤 자주) (OnRowCreated 또는 Hrefs를 암호화하는 것으로 반복하면서) 과세 될 수 있습니다.

오류 (들) : 내가 현재 간헐적 인 오류를 얻고있다
, 복제 할 수 없습니다 (그들은 매우 무작위 ... 날 믿어 ... 무작위로 발생), 다음과 같은 유형의 내가하려고 할 때 암호화 또는 암호 해독 :
오류 유형 1 : CreateProvHandle 오류 유형 2 : 지정한 파일을 찾을 수 없습니다. 오류 유형 3 : 인증되지 않은 작업을 시도했습니다.

오류 1과 2의 경우, 나는 그것을 지금까지 처리하기 위해 간단하게 재귀 적으로 그것을 발생시키는 방법 (암호화 또는 암호 해독)을 호출하고 대개 한 번만 반복합니다 (최대 3 개는 내 측정 항목을 사용했습니다) 그리고 마술처럼 오류가 사라집니다 ... 그래서 너무 많은 호출에 너무 빨리 개체 자체 또는 뭔가 비난했다 ...하지만 누군가가 어떤 일이 일어날 것인지 또는 어떻게 해결할 것인지에 대한 단서가 있다면, 나는 내 메소드를 재귀 적으로 호출하고 대신 주요 예외가 발생할 때이를 throw합니다. 그 위에 나는 CSP 저장소에 아무것도 유지하지 내 RSA params 얘기 그래서 파일 건 상관 없지만 분명히하지 않았다 ...

나는 그저 내 머리를 얻을 수 없다. ! 내 RSA 매개 변수는 CSP에서 아무 것도 유지하지 않기 때문에 언제 어떻게 파일에 액세스하려고하는지 (예, 반복하고 있습니다!), 제한된 파일 또는 사용자가 실행하지 않을 방법을 알지 못합니다. 접근 할 수 있니? 도와주세요 !!

여기 내 RSA 매개 변수에 대한 코드가 있습니다 ... 어쩌면 당신은 내가 뭘하려고하는지 (객체 인스턴스화에 키를 생성하고, 세션에 객체를 저장하고, 그 시점에서 그/사이트/.NET의 일부가 아닌 서버 프로세스에 대한 원격/호출과의 연결을 끊는다.

Normal Class 
    Static Crypto Class 
    End Static 
End Normal 

이 문제를 찾을 수 및 이유는 충돌 오류를 얻고 있었다 :

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

아 네 ... 바보 같은 실수 (? 그들은 항상하지 않습니다)? 저는 Static을 Normal로 바꿨고 모든 것이 숲의 목에 잘 어울립니다.

건배!

관련 문제