2013-04-28 2 views
0

큰 파일 암호화 : 나는 암호문을 변환해야 해독하려고 할 때 일이다는 RSA는 것은 내가 생각 해낸이 코드를 사용하여 RSA를 사용하여 파일을 암호화 한되는

 for (int a = 0; a <= iterations; a++) 
     { 
      byte[] plain; 
      int rsaLen = rsa.KeySize/8 - 11; 
      int bytesLen = plain.Length; 
      int block = bytesLen - rsaLen * a; 

      //The last block in the text may not be a full block 
      if (block > rsaLen) 
       plain = new byte[maxRsaLength]; 
      else 
       plainblock = new byte[block]; 

      Buffer.BlockCopy(plaintext, rsaLen * a, plain, 0, plain.Length); 

      //purfoming the encryption 
      ciphertext.Append(Convert.ToBase64String(rsa.Encrypt(plain, false))); 
     } 

을하는 내가 64 개의 기본 블록을 기본 64 개 블록에 넣었으나 RSAServiceProvider의 decrypt 메소드에서 잘못된 길이 exceptioonon을 얻고 있습니다. 나는이 사이트에 쓰인 예제를 따라왔다 : http://digitalsquid.co.uk/2009/01/rsa-in-cs/. 나는 암호 해독을 얻지 못한다. 나는 심지어 내가 암호화를 제대로했는지 확신 할 수 없다. 나는이 RSA IT에 파일을 분할하는 BEST NOT 것을 알고

public string Decrypt(string ciphertext, string key = null) 
    { 
     //checking for ciphertext. Exception raise if null 
     if (String.IsNullOrEmpty(ciphertext)) throw new ArgumentNullException(ciphertext, "There is no ciphertext to decrypt."); 

     //String holding the decrypted value 
     string plaintext = String.Empty; 

     //chanck is the user has provided a key. If not the use the one automatically generated 
     string keyToUse = String.IsNullOrEmpty(key) ? privatekey : key; 

     //set the key 
     rsa.FromXmlString(keyToUse); 

     //Determine the blocksizes for the iterations 
     int blockSize = ((rsa.KeySize/8) % 3 != 0) ? (((rsa.KeySize/8)/3) * 4) + 4 : ((rsa.KeySize/8)/3) * 4; 

     int iterations = ciphertext.Length/blockSize; 
     byte[] allPlaintextAsBytes = new byte[0]; 


     try 
     { 
      for (int i = 0; i < iterations; i++) 
      { 
       //to decrypt this we have to take the cipher text from a base 64 string an array. 
       byte[] cipherTextAsBytes = Convert.FromBase64String(ciphertext.Substring(blockSize * i, blockSize)); 

       byte[] partialPlaintextAsBytes = rsa.Decrypt(cipherTextAsBytes, false); 
      } 
     }....(Catch Exceptions down here) 

: 우는 내 해독 루프입니다. 예, 일반적으로 RSA로 AES와 같은 스트림 암호로 키를 암호화하고 AES로 파일을 암호화합니다. 이것은 내가하고있는 프로젝트이므로이 방법으로해야합니다.

미리 도움을 주셔서 감사합니다.

+3

프로젝트를 할당 한 사람은 누구도 그 사실을 모르는 다른 학생들에게 어리 석다는 것을 지적하십시오. 중첩 된 대칭 암호화를 수행하는 것은 보안 규칙이 아닙니다. RSA를 사용하여 직접 암호화를 수행하는 것이 안전하지 않습니다. 나는이 프로젝트에서 벗어난 한 세대의 학생들이 연습이 어쨌든 괜찮다고 생각하지 않을 것이다. –

+0

@MyseriousDan 나는 약간 동의하지 않습니다. 물론, 이런 식으로하는 것은 어리 석다. 그러나 "직접적인"RSA 암호화는 안전합니다. –

+0

조금 어리 석다. 512 키 또는 128로 암호화하는 것은 어리석지 만 사람들이이 번호의 작동 방식을 이해하는 데 도움이됩니다. 그가 나에게이 일을하도록 요청한 이유는이 일을하기 위해서입니다. 이 프로젝트를 수행함으로써 블록 암호가 모듈러스보다 큰 블록을 암호화 할 수 없다는 것을 지금까지 배웠습니다. 내가 프로젝트를 갖기 전에 나는 이것을 알지 못했다. 나는 안전하게 전문가라고 말할 수는 없지만 단지이 질문을 때려서는 안되며 그저 일을하는 데있어서 그 비정상적인 방식으로 만 대답하지 않아야합니다. 문제는 내가 쓰지 않은 코드가 개념이 아니라는 것입니다. –

답변

0

실제 RSA 구현은 암호화 할 수있는 일반 텍스트의 최대 길이에 영향을주는 패딩을 수행합니다.

특히 PKCS # 1 패딩 (가장 일반적인 종류)은 길이가 k - 11 바이트 인 일반 텍스트 만 지원합니다. 여기서 k는 키 길이입니다. OAEP 패딩은 최대 k - 2 * 해시 길이 - 2 길이 인 일반 텍스트만을 허용합니다 (OAEP는 사용중인 해시 알 고를 변경할 수 있습니다).

관련 문제