DES加密封装
public class Crypt {
private static String Algorithm = "DES"; // 定义 加密算法,可用 DES,DESede,Blowfish
static boolean debug = false;
static {
Security.addProvider(new com.sun.crypto.provider.SunJCE());
}
// 生成密钥, 注意此步骤时间比较长
public static byte[] getKey() throws Exception {
KeyGenerator keygen = KeyGenerator.getInstance(Algorithm);
SecretKey deskey = keygen.generateKey();
if (debug)
System.out.println("生成密钥:" + byte2hex(deskey.getEncoded()));
return deskey.getEncoded();
}
public static void getKey(String strKey) {
try {
KeyGenerator _generator = KeyGenerator.getInstance("DES");
_generator.init(new SecureRandom(strKey.getBytes()));
SecretKey deskey = _generator.generateKey();
System.out.println("生成密钥:" + byte2hex(deskey.getEncoded()));
_generator = null;
} catch (Exception e) {
e.printStackTrace();
}
}
// 加密
public static String encode(String input, String key) throws Exception {
return byte2hex(encode(input.getBytes(), key.getBytes()));
}
// 加密
public static byte[] encode(byte[] input, byte[] key) throws Exception {
// SecretKey deskey = new javax.crypto.spec.SecretKeySpec(key, Algorithm);
SecureRandom sr = new SecureRandom();
DESKeySpec dks = new DESKeySpec(key);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey deskey = keyFactory.generateSecret(dks);
if (debug) {
System.out.println("加密前的二进串:" + byte2hex(input));
System.out.println("加密前的字符串:" + new String(input));
}
Cipher c1 = Cipher.getInstance(Algorithm);
c1.init(Cipher.ENCRYPT_MODE, deskey, sr);
byte[] cipherByte = c1.doFinal(input);
if (debug)
System.out.println("加密后的二进串:" + byte2hex(cipherByte));
return cipherByte;
}
// 解密
public static String decode(String input, String key) throws Exception {
return new String(decode(hex2byte(input), key.getBytes()));
}
// 解密
public static byte[] decode(byte[] input, byte[] key) throws Exception {
SecretKey deskey = new javax.crypto.spec.SecretKeySpec(key, Algorithm);
if (debug)
System.out.println("解密前的信息:" + byte2hex(input));
Cipher c1 = Cipher.getInstance(Algorithm);
c1.init(Cipher.DECRYPT_MODE, deskey);
byte[] clearByte = c1.doFinal(input);
if (debug) {
System.out.println("解密后的二进串:" + byte2hex(clearByte));
System.out.println("解密后的字符串:" + (new String(clearByte)));
}
return clearByte;
}
// md5()信息摘要, 不可逆
public static byte[] md5(byte[] input) throws Exception {
java.security.MessageDigest alg = java.security.MessageDigest.getInstance("MD5"); // or "SHA-1"
if (debug) {
System.out.println("摘要前的二进串:" + byte2hex(input));
System.out.println("摘要前的字符串:" + new String(input));
}
alg.update(input);
byte[] digest = alg.digest();
if (debug)
System.out.println("摘要后的二进串:" + byte2hex(digest));
return digest;
}
// 字节码转换成16进制字符串
public static String byte2hex(byte[] b) {
String hs = "";
String stmp = "";
for (int n = 0; n < b.length; n++) {
stmp = (java.lang.Integer.toHexString(b[n] & 0XFF));
if (stmp.length() == 1)
hs = hs + "0" + stmp;
else
hs = hs + stmp;
// if (n < b.length - 1)
// hs = hs + ":";
}
// System.out.println("hs="+hs);
return hs.toUpperCase();
}
// 将16进制字符串转换成字节码
public static byte[] hex2byte(String hex) {
byte[] bts = new byte[hex.length() / 2];
for (int i = 0; i < bts.length; i++) {
bts[i] = (byte) Integer.parseInt(hex.substring(2 * i, 2 * i + 2), 16);
}
return bts;
}
public static void main(String[] args) throws Exception {
debug = true;
getKey("simonesi");
// byte[] key = getKey();
byte[] key = "好好学习".getBytes();
System.out.println(key.length);
SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
String time = format.format(new Date());
// decode(encode("<uid>testsz</uid><pwd>testsz</pwd><time>" + time + "</time>", "SHZHXWDM"), "SHZHXWDM");
decode(encode("<uid>zyhomepage</uid><pwd>zyhomepage</pwd>aabb", "JTKXYLIB"), "JTKXYLIB");
// decode("AF940EE6985915ECFE43D931C6CF4FA6DFF923DEB1025217EDE9BF738286BA77BDC0CDF6A6B8D2EC6763D11C5F0B798D",
// "JTKXYLIB");
// decode(
// "F19197667ABED47DA964C67D6B72B96BC15773FC91A2A105DD25378F79A5BCB22662C0F345807EBDD0DF21742CE72BE3DFD925B713D1C64557DCA2FA87400AD2",
// "TESTKEY2");
// md5("测试加密".getBytes());
// md5("A".getBytes());
}
}