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


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

Encryption problem with CipherInputStream/CipherOutputStream

From joven.chiew@gmail.com
Newsgroups comp.lang.java.programmer
Subject Encryption problem with CipherInputStream/CipherOutputStream
Date 2012-07-15 23:59 -0700
Organization http://groups.google.com
Message-ID <f5a68ef9-8fcf-4d1a-b9e5-a6db129ea260@googlegroups.com> (permalink)

Show all headers | View raw


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

Back to comp.lang.java.programmer | Previous | NextNext in thread | Find similar | Unroll thread


Thread

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

csiph-web