import java.io.*;
import javax.crypto.*;
import javax.crypto.spec.*;
import java.security.*;
public class desede {
public static void main(String args[]) throws Exception {
if (args[0].compareTo("+") == 0)// 控制是加密还是减密
{
KeyGenerator kg;// 生产密锁的工厂
FileInputStream fin;// 明文所在的文件
FileOutputStream fout;// 密文所在的文件
kg = KeyGenerator.getInstance("DESede");// 产生DESede算的密锁
fin = new FileInputStream(args[1]);// 打开文件
fout = new FileOutputStream(args[1] + ".DESede");// 写密文文件
kg.init(168);// 初始化密锁
SecretKey k = kg.generateKey();// 得到密锁
Cipher cp = Cipher.getInstance("DESede");// 生成加密工厂对象,DESede为加密算法
cp.init(Cipher.ENCRYPT_MODE, k);// 初始化加密器,Cipher.ENCRYPT_MODE指定加密,k为密锁
File f = new File(args[1]);// 得到明文大小
int num = (int) f.length();
byte[] rb = new byte[num];
fin.read(rb);// 读取明文
byte[] cb = cp.doFinal(rb);// 加密,将加密结果放在cb字节数组中
fout.write(cb);// 写入文件
fin.close();
fout.close();
fout = new FileOutputStream("key.DESede");// 保存密锁
fout.write(k.getEncoded());
fout.close();
System.out.print("\r\n\r\n");
System.out.print("加密文件" + args[1] + "完成\r\n");
System.out.print("密锁文件key.DESede\r\n");
return;
}
if (args[0].compareTo("-") == 0)// 减密时
{
FileInputStream fin;// 用于打开密锁文件和密明文件
FileOutputStream fout;// 写明文文件
fin = new FileInputStream("key.DESede");
File f = new File("key.DESede");
int num = (int) f.length();
byte[] kb = new byte[num];
fin.read(kb);// 读到密锁
fin.close();
SecretKeySpec k = new SecretKeySpec(kb, "DESede");// 将密锁存在SecretKey对象中
Cipher cp = Cipher.getInstance("DESede");// 生成解密工厂,DESede为算法
cp.init(Cipher.DECRYPT_MODE, k);// 初始化解密,Cipher.DECRYPT_MODE为解密方式,k为密锁
fout = new FileOutputStream(args[1]);
fin = new FileInputStream(args[1] + ".DESede");
f = new File(args[1] + ".DESede");
num = (int) f.length();
kb = new byte[num];
fin.read(kb);// 读取密文
byte[] m = cp.doFinal(kb);// 解密,将结果存在m字节数组中
fout.write(m);// 写入文件
fin.close();
fout.close();
return;
} else// 如果不是有效参数,则出现帮助信息
{
System.out.print("\r\n\r\n");
System.out.print("DESede算法加密解密:\r\n");
System.out.print(" '-' :减号解密;\r\n");
System.out.print(" filename:解密文件名;\r\n");
System.out.print(" '+' :加号加密;\r\n");
System.out.print(" filename:加密文件名;\r\n");
}
}//main
}//class
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import net.peoplesolution.wss.conf.SystemConfProp;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
public class DESede
{
public DESede()
{
}
public static byte[] getKey(String keystr)
{
int l = keystr.length() / 2;
byte w[] = new byte[l];
for(int i = 0; i < l; i++)
w[i] = (byte)(Integer.parseInt(keystr.substring(i * 2, i * 2 + 2), 16) & 0xff);
return w;
}
private static byte[] EncryptionByteData(byte SourceData[], String sKey, String sIV)
throws Exception
{
byte retByte[] = (byte[])null;
byte EncryptionByte[] = getKey(sKey);
javax.crypto.SecretKey securekey = new SecretKeySpec(EncryptionByte, "DESede");
IvParameterSpec spec = new IvParameterSpec(getKey(sIV));
Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");
cipher.init(1, securekey, spec);
retByte = cipher.doFinal(SourceData);
return retByte;
}
private static byte[] DecryptionByteData(byte SourceData[], String sKey, String sIV)
throws Exception
{
byte retByte[] = (byte[])null;
byte EncryptionByte[] = getKey(sKey);
javax.crypto.SecretKey securekey = new SecretKeySpec(EncryptionByte, "DESede");
IvParameterSpec spec = new IvParameterSpec(getKey(sIV));
Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");
cipher.init(2, securekey, spec);
retByte = cipher.doFinal(SourceData);
return retByte;
}
public static String EncryptCode(String strTobeEnCrypted, String sKey, String sIV)
throws Exception
{
String retStr = null;
byte retByte[] = (byte[])null;
byte sorData[] = strTobeEnCrypted.getBytes("UTF-8");
retByte = EncryptionByteData(sorData, sKey, sIV);
BASE64Encoder be = new BASE64Encoder();
retStr = be.encode(retByte);
return retStr;
}
public static String DecryptCode(String strTobeDeCrypted, String sKey, String sIV)
throws Exception
{
if(strTobeDeCrypted.lastIndexOf(" ") > 0)
strTobeDeCrypted = strTobeDeCrypted.replaceAll(" ", "+");
String retStr = null;
byte retByte[] = (byte[])null;
BASE64Decoder bd = new BASE64Decoder();
byte sorData[] = bd.decodeBuffer(strTobeDeCrypted);
retByte = DecryptionByteData(sorData, sKey, sIV);
retStr = new String(retByte, "UTF-8");
return retStr;
}
public static String DecryptCode(String strTobeDeCrypted)
throws Exception
{
return DecryptCode(strTobeDeCrypted, getKey(), getIV());
}
public static String EncryptCode(String strTobeEnCrypted)
throws Exception
{
return EncryptCode(strTobeEnCrypted, getKey(), getIV());
}
private static String getKey()
{
if(Key == null || Key.equals(""))
Key = SystemConfProp.getInstance().getProperty("key");
return Key;
}
private static String getIV()
{
if(IV == null || IV.equals(""))
IV = SystemConfProp.getInstance().getProperty("iv");
return IV;
}
private static final String DESede = "DESede/CBC/PKCS5Padding";
private static String Key;
private static String IV;
}