zbcong
asked on
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_MOD E, 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_MOD E, 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\\testk ey1");
c.encryptFile("c:\\temp\\n ewpassword s", "c:\\temp\\oooo", key);
c.decryptFile("c:\\temp\\o ooo", "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!!
my code as following:
public class EncryptHandler {
public EncryptHandler() {
}
public SecretKey genKey() {
try {
KeyGenerator kg = KeyGenerator.getInstance("
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_MOD
BufferedReader reader = new BufferedReader(new InputStreamReader(
new FileInputStream(srcPath)))
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
new CipherOutputStream(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 void decryptFile(String srcPath, String destPath, SecretKey key) {
try {
Cipher cp = Cipher.getInstance("DESede
cp.init(Cipher.DECRYPT_MOD
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\\testk
c.encryptFile("c:\\temp\\n
c.decryptFile("c:\\temp\\o
}
}
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!!
Don't use Reader and Writer - they may subject the stream to mutation
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/CB C/PKCS5Pad ding");
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,byt esRead);
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/CB C/PKCS5Pad ding");
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,byt esRead);
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");
}
}
//------------------------
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:
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/CB
SecretKeySpec desKey = new SecretKeySpec(key, "DES");
IvParameterSpec IV = new IvParameterSpec(iv,0,8);
cipher.init(Cipher.DECRYPT
bytesRead = fi.read(buffer);
totalBytes = bytesRead;
while(bytesRead > 0) {
buf = cipher.update(buffer,0,byt
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/CB
SecretKeySpec desKey = new SecretKeySpec(key, "DES");
IvParameterSpec IV = new IvParameterSpec(iv,0,8);
cipher.init(Cipher.ENCRYPT
bytesRead = fi.read(buffer);
totalBytes = bytesRead;
while(bytesRead > 0) {
buf = cipher.update(buffer,0,byt
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");
}
}
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
public void encryptFile(String srcPath, String destPath, SecretKey key) {
try {
Cipher cp = Cipher.getInstance("DESede
cp.init(Cipher.ENCRYPT_MOD
BufferedReader reader = new BufferedReader(new InputStreamReader(
new FileInputStream(srcPath)))
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
new CipherOutputStream(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);
}
}
public void decryptFile(String srcPath, String destPath, SecretKey key) {
try {
Cipher cp = Cipher.getInstance("DESede
cp.init(Cipher.DECRYPT_MOD
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);
}
}
ASKER
thanks for all of your helps very much
:-)