Метод Flush для outputtream ничего не делает - PullRequest
1 голос
/ 27 марта 2012

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

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!!!!!!");
    }
}

Ответы [ 2 ]

1 голос
/ 28 марта 2012

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

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

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

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

0 голосов
/ 28 марта 2012

Ну, для того, что я делал, кажется, что входной поток в методе дешифрования связывался с данными.Вместо того, чтобы расшифровывать его, когда он читался обратно, я расшифровывал его, когда он обрабатывался обратно.Пэддинг тоже немного запутался.Пришлось добавить дополнительные 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) {
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...