the encrypted file is cutted shorter

hello
my code as following:


public class EncryptHandler {

public EncryptHandler() {
}

public SecretKey genKey() {
try {
KeyGenerator kg = KeyGenerator.getInstance("DESede");
kg.init(168);
SecretKey key = kg.generateKey();
return key;
} catch (Exception e) {
e.printStackTrace();
System.exit(-1);
return null;
}
}

public SecretKey readKey(String path) {
try {
FileInputStream fin = new FileInputStream(path);
int num = fin.available();
byte[] keykb = new byte[num];
fin.read(keykb);

SecretKeySpec key = new SecretKeySpec(keykb, "DESede");
return key;

} catch (Exception e) {
e.printStackTrace();
System.exit(-1);
return null;
}
}

public void saveKeyAsObject(SecretKey key, String destPath) {
try {
ObjectOutputStream o = new ObjectOutputStream(new FileOutputStream(
destPath));
o.writeObject(key);
} catch (Exception e) {
System.exit(-1);
e.printStackTrace();
}

}

public void saveKeyAsByte(SecretKey key, String destPath) {
try {
byte[] kb = key.getEncoded();
FileOutputStream fo = new FileOutputStream(destPath);
fo.write(kb);
} catch (Exception e) {
e.printStackTrace();
System.exit(-1);
}

}

public void encryptFile(String srcPath, String destPath, SecretKey key) {
try {

Cipher cp = Cipher.getInstance("DESede");
cp.init(Cipher.ENCRYPT_MODE, key);

BufferedReader reader = new BufferedReader(new InputStreamReader(
new FileInputStream(srcPath)));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
new CipherOutputStream(new FileOutputStream(destPath), cp)));

String tmpStr = "";
while ((tmpStr = reader.readLine()) != null) {

writer.write(tmpStr + "\n");
writer.flush();
}
} catch (Exception e) {
e.printStackTrace();
System.exit(-1);
}
}

public void decryptFile(String srcPath, String destPath, SecretKey key) {
try {
Cipher cp = Cipher.getInstance("DESede");
cp.init(Cipher.DECRYPT_MODE, key);
BufferedReader reader = new BufferedReader(new InputStreamReader(
new CipherInputStream(new FileInputStream(srcPath), cp)));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(destPath)));
String tmpStr = "";
while ((tmpStr = reader.readLine()) != null) {
writer.write(tmpStr + "\n");
writer.flush();
}
} catch (Exception e) {
e.printStackTrace();
System.exit(-1);
}

}

public static void main(String[] argv) {
String s = "Hello world!!!!";
EncryptHandler c = new EncryptHandler();
SecretKey key = c.genKey();
c.saveKeyAsByte(key, "c:\\temp\\testkey1");
SecretKey k = c.readKey("c:\\temp\\testkey1");
c.encryptFile("c:\\temp\\newpasswords", "c:\\temp\\oooo", key);
c.decryptFile("c:\\temp\\oooo", "c:\\temp\\ttttt", key);

}
}




i use symetrical key encrypt text firle the flow as follow:
1 generate key
2 save the key to the disk
3 read the key from disk
4 encrypt a text file
5 decrypt the file generated in step 4

but i find the final text file is cutted shortter then the original one, and i think the such problem result from "encryptFile" method, i guess it maybe result from the "padding" problem, but i don't know how to solve it, i am a beginner, who can help me?

thank you very much!!
zbcongAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

CEHJCommented:
Don't use Reader and Writer - they may subject the stream to mutation
0
Kelvin_KingCommented:
I wrote a little program a while back to encrypt and decrypt using DES. Maybe you can have a look at it to have an idea on it's done. The only difference is, I hard coded the keys into the program, but it's pretty easy to modify it to read from a file. Hope it helps.

//-----------------------------------------------------------------------------
import java.io.*;
import java.security.*;
import javax.crypto.*;
import javax.crypto.spec.*;

public class DES {

      public static void main(String args[]) throws Exception {
      
            FileInputStream fi = new FileInputStream(args[1]);
            FileOutputStream fo = new FileOutputStream(args[2]);
            byte[] key = { 9 , 5, 1, 9, 3, 7, 13, 17 };
            byte[] iv = { 2, 3, 5, 7, 11, 5, 1, 8 };
            if(args[0].equals("e"))
            Encrypt(fi, fo, key, iv);
            else if(args[0].equals("d"))
            Decrypt(fi, fo, key, iv);
            else
            System.out.println("Usage: java filename <option (e/d)> <input file> <output file>");
            fi.close();
            fo.close();
      }
      
      //function for decryption
      public static void Decrypt(InputStream fi, OutputStream fo, byte[] key, byte[] iv) throws Exception {
            long startTime, endTime;
            double avgTime;
            int totalBytes, bytesRead;
            byte[] buffer = new byte[1024];
            byte[] buf;
            startTime = System.currentTimeMillis();
            
            Cipher cipher;
            cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
            SecretKeySpec desKey = new SecretKeySpec(key, "DES");
            IvParameterSpec IV = new IvParameterSpec(iv,0,8);
            cipher.init(Cipher.DECRYPT_MODE, desKey, IV);
            
          bytesRead = fi.read(buffer);
            totalBytes = bytesRead;
            while(bytesRead > 0) {
                  buf = cipher.update(buffer,0,bytesRead);
                  bytesRead = fi.read(buffer);
                  totalBytes += bytesRead;
                  fo.write(buf);
            }
            
            buf = cipher.doFinal();
            fo.write(buf);
            
            endTime = System.currentTimeMillis();
            
            avgTime = ((endTime-startTime)*1e6) / totalBytes;
            System.out.println("Time taken DES encryption: " + avgTime + " ns/byte ");
      }
      
      //function for encryption
      public static void Encrypt(InputStream fi, OutputStream fo, byte[] key, byte[] iv) throws Exception {
            long startTime, endTime;
            double avgTime;
            int totalBytes, bytesRead;
            byte[] buffer = new byte[1024];
            byte[] buf;
            startTime = System.currentTimeMillis();
            
            Cipher cipher;
            cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
            SecretKeySpec desKey = new SecretKeySpec(key, "DES");
            IvParameterSpec IV = new IvParameterSpec(iv,0,8);
            cipher.init(Cipher.ENCRYPT_MODE, desKey, IV);
            
            bytesRead = fi.read(buffer);
            totalBytes = bytesRead;
            while(bytesRead > 0) {
                  buf = cipher.update(buffer,0,bytesRead);
                  bytesRead = fi.read(buffer);
                  totalBytes += bytesRead;
                  fo.write(buf);
            }
            
            buf = cipher.doFinal();
            fo.write(buf);
            
            endTime = System.currentTimeMillis();
            avgTime = ((endTime-startTime)*1e6) / totalBytes;
            System.out.println("Time taken DES decryption: " + avgTime + " ns/byte");
      }
}
0
WebstormCommented:
Don't forget to call the close() methods when you open an output stream :
public void saveKeyAsObject(SecretKey key, String destPath) {
try {
ObjectOutputStream o = new ObjectOutputStream(new FileOutputStream(
destPath));
o.writeObject(key);
o.close(); // <--
} catch (Exception e) {
System.exit(-1);
e.printStackTrace();
}

}

public void saveKeyAsByte(SecretKey key, String destPath) {
try {
byte[] kb = key.getEncoded();
FileOutputStream fo = new FileOutputStream(destPath);
fo.write(kb);
fo.close(); // <--
} catch (Exception e) {
e.printStackTrace();
System.exit(-1);
}

}

0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
Cloud Class® Course: C++ 11 Fundamentals

This course will introduce you to C++ 11 and teach you about syntax fundamentals.

WebstormCommented:

public void encryptFile(String srcPath, String destPath, SecretKey key) {
try {

Cipher cp = Cipher.getInstance("DESede");
cp.init(Cipher.ENCRYPT_MODE, key);

BufferedReader reader = new BufferedReader(new InputStreamReader(
new FileInputStream(srcPath)));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
new CipherOutputStream(new FileOutputStream(destPath), cp)));

String tmpStr = "";
while ((tmpStr = reader.readLine()) != null) {

writer.write(tmpStr + "\n");
writer.flush();
write.close(); // <----
}
} catch (Exception e) {
e.printStackTrace();
System.exit(-1);
}
}

public void decryptFile(String srcPath, String destPath, SecretKey key) {
try {
Cipher cp = Cipher.getInstance("DESede");
cp.init(Cipher.DECRYPT_MODE, key);
BufferedReader reader = new BufferedReader(new InputStreamReader(
new CipherInputStream(new FileInputStream(srcPath), cp)));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(destPath)));
String tmpStr = "";
while ((tmpStr = reader.readLine()) != null) {
writer.write(tmpStr + "\n");
writer.flush();
write.close(); // <----
}
} catch (Exception e) {
e.printStackTrace();
System.exit(-1);
}

}
0
zbcongAuthor Commented:
thanks for all of your helps very much
0
WebstormCommented:
:-)
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Java

From novice to tech pro — start learning today.

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.