1.DES算法简介
DES(Data Encryption Standard)是发明最早的最广泛使用的分组对称加密算法。DES算法的入口参数有三个:Key、Data、Mode。其中Key为8个字节共64位,是DES算法的工作密钥;Data也为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密。
DES算法工作流程如下:若Mode为加密模式,则利用Key 对数据Data进行加密, 生成Data的密码形式(64位)作为DES的输出结果;如Mode为解密模式,则利用Key对密码形式的数据Data进行解密,还原为Data的明码形式(64位)作为DES的输出结果。在通信网络的两端,双方约定一致的Key,在通信的源点用Key对核心数据进行DES加密,然后以密码形式在公共通信网(如电话网)中传输到通信网络的终点,数据到达目的地后,用同样的Key对密码数据进行解密,便再现了明码形式的核心数据。这样,便保证了核心数据在公共通信网中传输的安全性和可靠性。
也可以通过定期在通信网络的源端和目的端同时改用新的Key,便能更进一步提高数据的保密性。
2.代码实现
下面是实现的粗糙的实现,有兴趣的朋友可以将输入输出部分用swing实现,以增加易用性。
public class FileProc {
private Cipher cip = null;
private int MODE = 2;
private String inputfilename = null;
private String outputfilename = null;
/**
* @param args
*/
public static void main(String[] args) {
FileProc f = new FileProc();
f.inputfilename = "c://移动物流项目总体设计2.doc";
f.outputfilename = "c://移动物流项目总体设计3.doc";
f.init();
f.ProcData();
}
private InputStream readFile(String filename) throws FileNotFoundException {
return new FileInputStream(filename);
}
private OutputStream writeFile(String filename)
throws FileNotFoundException {
return new FileOutputStream(filename);
}
private void ProcData() {
try {
InputStream in = readFile(inputfilename);
OutputStream out = writeFile(outputfilename);
if (MODE == 1) {
byte[] data = new byte[1024];
byte[] data2 = null;
ObjectOutputStream oo = new ObjectOutputStream(out);
while (in.read(data) > 0) {
data2 = cip.doFinal(data);
oo.writeObject(data2);
}
oo.close();
} else {
ObjectInputStream oi = new ObjectInputStream(in);
byte[] data = null;
byte[] data2 = null;
while (true) {
try {
data = (byte[]) oi.readObject();
} catch (EOFException e) {
break;
}
data2 = cip.doFinal(data);
out.write(data2);
}
oi.close();
}
in.close();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
private void init() {
Security.addProvider(new com.sun.crypto.provider.SunJCE());
String Algorithm = "DES";
KeyGenerator keygen;
try {
SecretKey deskey = null;
if (MODE == 1) {
keygen = KeyGenerator.getInstance(Algorithm);
deskey = keygen.generateKey();
OutputStream out = writeFile(outputfilename + ".key");
ObjectOutputStream oo = new ObjectOutputStream(out);
oo.writeObject(deskey);
oo.close();
out.close();
} else {
deskey = (SecretKey) new ObjectInputStream(
readFile(inputfilename + ".key")).readObject();
}
cip = Cipher.getInstance(Algorithm);
cip.init(MODE, deskey);
} catch (Exception e) {
e.printStackTrace();
}
}
}