2012-03-27 2 views
1

Пытается что-то, что частично включает в себя шифрование файла. Все хорошо, за исключением этой маленькой проблемы. По какой-то причине. метод flush работает до n> 52, где n - количество циклов. Вы можете увидеть это в методе дешифрования. Если я меняю n fomr < 10 на < 53, он сбрасывается. Я проверил его, посмотрев файл. новое содержание не добавляется до 53. Но должно быть.Метод Flush выходного потока ничего не делает

public class DesEncrypter { 
Cipher ecipher; 
Cipher dcipher; 

DesEncrypter(SecretKey key) { 
    // Create an 8-byte initialization vector 
    byte[] iv = new byte[]{ 
     (byte)0x8E, 0x12, 0x39, (byte)0x9C, 
     0x07, 0x72, 0x6F, 0x5A 
    }; 
    AlgorithmParameterSpec paramSpec = new IvParameterSpec(iv); 
    try { 
     ecipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); 
     dcipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); 

     // CBC requires an initialization vector 
     ecipher.init(Cipher.ENCRYPT_MODE, key, paramSpec); 
     dcipher.init(Cipher.DECRYPT_MODE, key, paramSpec); 
    } catch (java.security.InvalidAlgorithmParameterException e) { 
    } catch (javax.crypto.NoSuchPaddingException e) { 
    } catch (java.security.NoSuchAlgorithmException e) { 
    } catch (java.security.InvalidKeyException e) { 
    } 
} 

// Buffer used to transport the bytes from one stream to another 
byte[] buf = new byte[1024]; 

public void encrypt(InputStream in, OutputStream out) { 
    try { 
     // Bytes written to out will be encrypted 
     AppendableOutputStream out_append = new AppendableOutputStream(out); 

     OutputStream out_c = new CipherOutputStream(out_append, ecipher); 

     // Read in the cleartext bytes and write to out to encrypt 
     int numRead = 0; 
     int count = 0; 
     int max = 1024; 
     boolean first = true; 

     while ((numRead = in.read(buf, 0, max)) > 0) {     
      System.out.println("running Total: " + count); 
      count += numRead; 
      // if this read puts as at less than a meg, encrypt 
      if(count <= 1024*1024){ 
       System.out.println("encrypted " + numRead + " of " + max +" bytes : total " + count); 
       out_c.write(buf, 0, numRead); 
       // last encryption pass, close buffer and fix max 
       if(count == 1024*1024){ 
        // fix reading 1k in case max was decreased 
        max = 1024; 
        out_c.close(); 
       } 
       // if next read will go over a meg, read less than 1k 
       else if(count + max > 1024*1024) 
        max = 1024*1024 - count; 
      } 
      // past the first meg, don't encrypt 
      else{ 
       System.out.println("processed " + numRead + " of " + max +" bytes : total " + count); 
       out.write(buf, 0, numRead); 
      } 

     } 
     out.close(); 

    } catch (java.io.IOException e) {} 

} 

// Movies encrypt only 1 MB 128 passes. 

public void decrypt(InputStream in, OutputStream out) { 
    try { 
     // Bytes read from in will be decrypted 
     InputStream in_c = new CipherInputStream(in, dcipher); 

     // Read in the decrypted bytes and write the cleartext to out 
     int numRead = 0; 
     int count = 0; 
     int max = 1024; 

     while ((numRead = in_c.read(buf, 0, max)) > 0) { 
      count += numRead; 
      System.out.println("decrypted " + numRead + " of " + max +" bytes : total " + count); 
      out.write(buf, 0, numRead); 
      if(count + max > 1024*1024){ 
       max = 1024*1024 - count; 
      } 
      if(count == 1024*1024) 
       max = 0; 
     } 

     //in.skip(count); 
     int n = 0; 
     while((numRead = in.read(buf)) > 0 && n < 10){ 
     count += numRead; 
     System.out.println("processed " + numRead + " of 1024 bytes : total " + count); 
      out.write(buf,0,numRead); 
      //System.out.println("buf"+buf.length +" numered" + numRead+ " n"+n); 
      // If i look at the file after anything under n < 51 the file doesn't change. 
      n++; 

     } 
     out.flush(); 
     out.close(); 
    } catch (java.io.IOException e) { 
     System.out.println("AHHHHHHHH!!!!!!"); 
    } 
} 
+4

Это никогда не будет хорошей идеей: catch (java.io.IOException e) {}. Пустой блок блокировки означает, что вы никогда не узнаете, есть ли проблемы. По крайней мере, распечатайте трассировку стека. Мне не нравится это видеть: System.out.println («AHHHHHHHH !!!!!!»); Меньше информации; распечатать трассировку стека. – duffymo

+0

Отладчик - ваш друг. Вы должны использовать его и смотреть на то, что происходит в этом методе. –

+0

Искренне непонятно. Вы говорите, что метод flush работает до n> 52, но не сбрасывается до 53, а вызов флеша полностью выходит за пределы цикла и не будет работать до тех пор, пока цикл не закончится. Не могли бы вы уточнить, что такое настоящая проблема? –

ответ

1

С данной информацией я могу только догадываться. По крайней мере, было бы очень полезно, если бы вы указали, какой тип OutputStreamout - это когда вы вызываете метод decrypt. Поведение метода flush() варьируется между различными конкретными реализациями.

Например, если ваш выходной поток случается быть CipherOutputStream, или какой-то другой поток, который подключается к этому типу потока, то документация по его методу flush() утверждает следующее (важная часть подчеркнутый мной):

Сбрасывает этот выходной поток, заставляя любые буферизованные выходные байты, которые уже были обработаны инкапсулированным зашифрованным объектом, который должен быть выписан. Любые байты, буферизованные инкапсулированным шифром и ожидающие его обработки, не будут выписаны. Например, , если инкапсулированный шифр является блочным шифрованием, а общее количество байтов, написанных с использованием одного из методов записи, меньше размера блока шифрования, байты не будут выписаны.

Это, безусловно, похоже, что это может быть причиной вашей проблемы. Однако, как я уже сказал, было бы очень полезно узнать некоторые подробности о вашем конкретном типе потока.

0

Хорошо, что я делал, кажется, что входной поток в методе дешифрования возился с данными. Вместо того, чтобы расшифровывать его, когда он читался, я расшифровывал его, когда он обрабатывался обратно. Прокладка тоже испортила его. Придется добавить дополнительные 8 байтов в код 1024 * 1024 в методе дешифрования. Если кто интересуется здесь, пересмотренные методы Спасибо всем за помощь.

public void encrypt(InputStream in, OutputStream out) { 
    try { 
     // Bytes written to out will be encrypted 
     AppendableOutputStream out_append = new AppendableOutputStream(out); 

     OutputStream out_c = new CipherOutputStream(out_append, ecipher); 

     // Read in the cleartext bytes and write to out to encrypt 
     int numRead = 0; 
     int count = 0; 
     int max = 1024; 
     boolean first = true; 

     while ((numRead = in.read(buf, 0, max)) > 0) {     
      //System.out.println("running Total: " + count); 
      count += numRead; 
      // if this read puts as at less than a meg, encrypt 
      if(count <= 1024*1024){ 
       //System.out.println("encrypted " + numRead + " of " + max +" bytes : total " + count); 
       out_c.write(buf, 0, numRead); 
       // last encryption pass, close buffer and fix max 
       if(count == 1024*1024){ 
        // fix reading 1k in case max was decreased 
        max = 1024; 
        out_c.close(); 
       } 
       // if next read will go over a meg, read less than 1k 
       else if(count + max > 1024*1024) 
        max = 1024*1024 - count; 
      } 
      // past the first meg, don't encrypt 
      else{ 
       //System.out.println("processed " + numRead + " of " + max +" bytes : total " + count); 
       out.write(buf, 0, numRead); 
      } 

     } 
     out.flush(); 

     out.close(); 

    } catch (java.io.IOException e) { 

     System.out.println("AHHHHHHHH!!!!!!111"); 

    } 

} 

// Movies encrypt only 1 MB 128 passes. 

public void decrypt(InputStream in, OutputStream out) { 
    try { 
     // Bytes written to out will be decrypted 
     AppendableOutputStream out_append = new AppendableOutputStream(out); 
     System.out.println(ecipher.getOutputSize(1024*1024)); 
     OutputStream out_d = new CipherOutputStream(out_append, dcipher); 

     // Read in the decrypted bytes and write the cleartext to out 
     int numRead = 0; 
     int count = 0; 
     int max = 1024; 

     while ((numRead = in.read(buf, 0, max)) > 0) { 
      count += numRead; 
      if(count <= ecipher.getOutputSize(1024*1024)){ 
       out_d.write(buf, 0, numRead); 
       // last encryption pass, close buffer and fix max 
       if(count == ecipher.getOutputSize(1024*1024)){ 
        // fix reading 1k in case max was decreased 
        max = 1024; 
        out_d.close(); 
       } 
       // if next read will go over a meg, read less than 1k 
       else if(count + max > ecipher.getOutputSize(1024*1024)) 
        max = ecipher.getOutputSize(1024*1024) - count; 
      } 
      // past the first meg, don't decrypt 
      else{ 
       out.write(buf, 0, numRead); 
      } 

     } 
     out.close(); 
    } catch (java.io.IOException e) { 
    } 
} 
Смежные вопросы