Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.java.programmer > #16037 > unrolled thread

Encryption problem with CipherInputStream/CipherOutputStream

Started byjoven.chiew@gmail.com
First post2012-07-15 23:59 -0700
Last post2012-07-16 09:50 -0700
Articles 2 — 2 participants

Back to article view | Back to comp.lang.java.programmer


Contents

  Encryption problem with CipherInputStream/CipherOutputStream joven.chiew@gmail.com - 2012-07-15 23:59 -0700
    Re: Encryption problem with CipherInputStream/CipherOutputStream Daniel Pitts <newsgroup.nospam@virtualinfinity.net> - 2012-07-16 09:50 -0700

#16037 — Encryption problem with CipherInputStream/CipherOutputStream

Fromjoven.chiew@gmail.com
Date2012-07-15 23:59 -0700
SubjectEncryption problem with CipherInputStream/CipherOutputStream
Message-ID<f5a68ef9-8fcf-4d1a-b9e5-a6db129ea260@googlegroups.com>
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? 

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();
	}

[toc] | [next] | [standalone]


#16044

FromDaniel Pitts <newsgroup.nospam@virtualinfinity.net>
Date2012-07-16 09:50 -0700
Message-ID<gDXMr.36$oe7.9@newsfe12.iad>
In reply to#16037
On 7/15/12 11:59 PM, joven.chiew@gmail.com 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.

[toc] | [prev] | [standalone]


Back to top | Article view | comp.lang.java.programmer


csiph-web