2013-04-28 2 views
0

Вещи я зашифрованный файл с помощью ПДСА с помощью этого кода, который я придумал: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. Я следую примеру, написанному на этом сайте: http://digitalsquid.co.uk/2009/01/rsa-in-cs/ безрезультатно. Я не получаю никаких ошибок encrption только расшифровки. Я не могу даже быть уверенным, правильно ли я прав. Пыльник моего дешифрования цикл:

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 IT. Да, обычно вы шифруете ключ для шифрования потока, такого как AES с RSA, и шифруете файл с помощью AES. Это проект, который я делаю, поэтому я должен сделать это таким образом.

Благодарим за помощь заранее.

+3

Убедитесь, что тот, кто назначил проект, указывает, что это глупо для других учеников, которые могут этого не знать. Это не просто соглашение о безопасности, которое выполняет вложенное симметричное шифрование: он не уверен в необходимости прямого шифрования с помощью RSA. Я бы не хотел, чтобы поколение студентов уходило от этого проекта, думая, что практика в любом случае в порядке. –

+0

@MyseriousDan Я бы не согласился. Конечно, глупо делать это так. Однако «прямое» шифрование RSA является безопасным. –

+0

Это немного глупо да. Шифрование с помощью ключа 512 или 128 глупо, но это помогает людям понять, как работают эти числа. Причина, по которой он попросил меня сделать это, так я получаю, чтобы сделать эту работу. Просто выполнив этот проект, я до сих пор узнал, что блокирующие шифры не могут шифровать блоки, большие, чем модуль. Я не знал этого, прежде чем получил проект. Я могу смело сказать, что я не эксперт, но те, которые не должны просто избивать этот вопрос и даже не отвечать на него просто из-за его необычного способа делать вещи. Вопрос в том, что код, который я написал, не работает, а не понятия –

ответ

0

Реальные реализации RSA делают заполнение, которое влияет на максимальную длину открытого текста, который может быть зашифрован.

В частности, дополнение PKCS # 1 (наиболее распространенный вид) поддерживает только текстовые файлы длиной k - 11 байтов, где k - длина ключа. OAEP padding принимает только открытый текст, длина до - 2 * хэш-длины - 2 (OAEP позволяет вам изменить используемый вами хэш-алгоритм).

Смежные вопросы