Encryption problem with CipherInputStream/CipherOutputStream
Hi I have the following code I tested to encrypt/decrypt file and all is go=
od. It works correctly for full file encryption and now I want to test part=
ial encryption of 100000 bytes. I tried read the 100000 from a text file fu=
ll 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 Ciph=
erInputStream 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 i=
s wrong, how can I correct it?
EOF -> "qwertyqwertyqwertyqwertyqwertyqwerty=B1=84w'=E7=F8]uX\=9CaQ2=CBI=F5=
=93=DC=B1=F5=FE=CB=DCTN=B3'"
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();
}