Reputation: 8722
This is my original xml:
<?xml version="1.0" encoding="UTF-8"?>
<table>
<row>
<id>12</id>
<name>Mickey Mouse</name>
</row>
</table>
This is the output after going through encryption/decryption process
<?xml version="1.0" encoding="UTF-8"?>
<table>
<row>
<id>12</id>
<name>Mickey Mouse</name>
</row>
</
As you can see, few characters are missing.
here is my code.
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.CipherInputStream;
import javax.crypto.CipherOutputStream;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.SecretKeySpec;
public class Decrypter
{
/**
* @param args
* @throws IOException
* @throws NoSuchPaddingException
* @throws NoSuchAlgorithmException
* @throws InvalidKeyException
* @throws BadPaddingException
* @throws IllegalBlockSizeException
*/
public static void main(String[] args) throws IOException,
NoSuchAlgorithmException, NoSuchPaddingException,
InvalidKeyException, IllegalBlockSizeException, BadPaddingException
{
// TODO Auto-generated method stub
File iFile = new File("normal.xml");
FileInputStream fis = new FileInputStream(iFile);
File oFile = new File("normal.xml.encrypted");
FileOutputStream fos = new FileOutputStream(oFile);
String algorithm = "DESede";
byte[] keyBytes = new byte[] { 0x34, 0x11, 0x12, 0x06, 0x34, 0x11,
0x12, 0x06, 0x34, 0x11, 0x12, 0x06, 0x34, 0x11, 0x12, 0x06,
0x34, 0x11, 0x12, 0x06, 0x34, 0x11, 0x12, 0x06 };
SecretKeySpec key = new SecretKeySpec(keyBytes, algorithm);
// generates encrypted output from normal.xml.
Cipher cipher = Cipher.getInstance(algorithm);
cipher.init(Cipher.ENCRYPT_MODE, key);
CipherOutputStream cos = new CipherOutputStream(fos, cipher);
int b;
while ((b = fis.read()) != -1)
{
cos.write(b);
}
fos.close();
fos = null;
fis.close();
fis = null;
System.out.println("done");
// decrypt encrypted xml to normal xml.
File ieFile = new File("normal.xml.encrypted");
FileInputStream fies = new FileInputStream(ieFile);
Cipher ieCipher = Cipher.getInstance(algorithm);
ieCipher.init(Cipher.DECRYPT_MODE, key);
CipherInputStream cis = new CipherInputStream(fies, ieCipher);
File oeFile = new File("normal.xml.encrypted.xml");
FileOutputStream foes = new FileOutputStream(oeFile);
int c;
while ((c = cis.read()) != -1)
{
foes.write(c);
}
foes.close();
cis.close();
fies.close();
System.out.println("done done");
}
}
Please help. Thanks.
Upvotes: 3
Views: 2385
Reputation: 398
agree with JASON. You have to close Cipher stream instead of file. even you can explicitly close both but make sure you close cipher stream first and then file stream. only flushing will not help. at least it didn't worked for me. :)
Upvotes: 0
Reputation: 1491
After writing the encrypted output, call
cos.close();
instead of
fos.close();
Closing the cos object also closes the underlying fos object.
Upvotes: 5
Reputation: 13709
Found the problem. Do
cos.close();
before the line:
fos.close();
At least, that fixed it on my box.
Upvotes: 8
Reputation: 52994
Try closing (or at least flushing) your CipherOutputStream
(cos
) as there may be some bytes that never got written to the original encrypted file.
Upvotes: 1