Encryption problem with CipherInputStream/CipherOutputStream

Discussion in 'Java' started by joven.chiew@gmail.com, Jul 16, 2012.

  1. Guest

    Hi I have the following code I tested to encrypt/decrypt file and all is good. It works correctly for full file encryption and now I want to test partial encryption of 100000 bytes. I tried read the 100000 from a text file full of "qwerty" text and encrypt it in another file and I am able to decryptthis file back to the 100000 bytes of "qwerty" output to a new test file.

    So it seems like the partial encryption is ok, all I need is implement CipherInputStream to decrypt the first 100000 bytes write to a output file and do a normal FileInputStream and write to the output write. Theoretically I should have implemented the partial file encryption/decryption.

    Now, when I open the output file, I saw unreadable character at EOL. What is wrong, how can I correct it?

    EOF -> "qwertyqwertyqwertyqwertyqwertyqwerty±„w'çø]uX\œaQ2ËIõ“ܱõþËÜTN³'"

    Cheers.

    public static void encryptFile(SecretKey key, File sourceFile,
    File secretFile) throws Exception {
    byte[] salt = new byte[8];
    Random random = new Random();
    random.nextBytes(salt);

    final int BUFF_SIZE = 100000;
    final byte[] buffer = new byte[BUFF_SIZE];

    PBEParameterSpec spec = new PBEParameterSpec(salt, ITERATIONCOUNT);
    Cipher cipher = Cipher.getInstance(ALGORITHM2);
    cipher.init(Cipher.ENCRYPT_MODE, key, spec);

    InputStream in = null;
    OutputStream out = null;
    in = new FileInputStream(sourceFile);
    out = new FileOutputStream(secretFile);
    CipherOutputStream cos = new CipherOutputStream(out, cipher);

    try {
    out.write(salt);
    boolean pEncrypt = true;
    while (true) {
    synchronized (buffer) {
    int amountRead = in.read(buffer);
    if (amountRead == -1) {
    break;
    }
    if (pEncrypt) {
    cos.write(buffer, 0, amountRead);
    pEncrypt = false;
    } else {
    out.write(buffer, 0, amountRead);
    }
    }
    }
    } finally {
    if (in != null) {
    in.close();
    }
    if (cos != null) {
    cos.close();
    out.close();
    }
    }
    }

    public static void decryptFile(SecretKey key, File secretFile,
    File decryptFile) throws Exception {
    byte[] salt = new byte[8];

    final int BUFF_SIZE = 100000;
    final byte[] buffer = new byte[BUFF_SIZE];

    InputStream bis = null;
    OutputStream out = null;
    bis = new FileInputStream(secretFile);
    out = new FileOutputStream(decryptFile);

    bis.read(salt);

    PBEParameterSpec spec = new PBEParameterSpec(salt, ITERATIONCOUNT);
    Cipher cipher = Cipher.getInstance(ALGORITHM2);
    cipher.init(Cipher.DECRYPT_MODE, key, spec);

    CipherInputStream in = new CipherInputStream(bis, cipher);

    int b = 1;
    Boolean pEncrypt = true;
    while (true) {
    synchronized (buffer) {
    if (pEncrypt) {
    b = in.read(buffer);
    pEncrypt = false;
    } else {
    b = bis.read(buffer);
    }
    if (b == -1) {
    break;
    }
    out.write(buffer, 0, b);
    }
    }
    out.close();
    bis.close();
    in.close();
    }
     
    , Jul 16, 2012
    #1
    1. Advertising

  2. Daniel Pitts Guest

    On 7/15/12 11:59 PM, wrote:
    > Hi I have the following code I tested to encrypt/decrypt file and all is good. It works correctly for full file encryption and now I want to test partial encryption of 100000 bytes. I tried read the 100000 from a text file full of "qwerty" text and encrypt it in another file and I am able to decrypt this file back to the 100000 bytes of "qwerty" output to a new test file.
    >
    > So it seems like the partial encryption is ok, all I need is implement CipherInputStream to decrypt the first 100000 bytes write to a output file and do a normal FileInputStream and write to the output write. Theoretically I should have implemented the partial file encryption/decryption.
    >
    > Now, when I open the output file, I saw unreadable character at EOL. What is wrong, how can I correct it?


    Please don't use tabs in usenet.

    I've snipped your source from this reply, but what was striking to me
    was that you used the COS for only the first write, and then never
    flushed it. COS may have some buffering behind the scenes. Even if you
    call flush on it, that may not be sufficient as many block ciphers
    require a full block before they can produce output. You seem to want
    to mix encrypted and unencrypted data in the same output stream, which
    seems dubious at best, since you don't have any clear demarcation of
    where the various data start and end.
     
    Daniel Pitts, Jul 16, 2012
    #2
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Guenther Sohler

    Encryption Problem

    Guenther Sohler, Oct 17, 2003, in forum: Perl
    Replies:
    1
    Views:
    507
    Jim Gibson
    Oct 20, 2003
  2. Natty Gur

    Re: encryption problem

    Natty Gur, Jul 16, 2003, in forum: ASP .Net
    Replies:
    0
    Views:
    509
    Natty Gur
    Jul 16, 2003
  3. Fernando Barsoba

    Data type problem in encryption algorithm

    Fernando Barsoba, Nov 25, 2005, in forum: C Programming
    Replies:
    11
    Views:
    619
    Flash Gordon
    Nov 26, 2005
  4. Fernando Barsoba

    problem with encryption function sending hex values

    Fernando Barsoba, Nov 27, 2005, in forum: C Programming
    Replies:
    2
    Views:
    313
    Fernando Barsoba
    Nov 28, 2005
  5. jimgardener

    using CipherInputStream

    jimgardener, Jun 17, 2008, in forum: Java
    Replies:
    6
    Views:
    1,393
    Arne Vajhøj
    Jun 19, 2008
Loading...

Share This Page