(1)算法的独立性和可靠性。
(2)实现的独立性和相互作用性。
算法的独立性是通过定义密码服务类来获得。用户只需了解密码算法的概念,而不用去关心如何实现这些概念。实现的独立性和相互作用性通过密码服务提供器来实现。密码服务提供器是实现一个或多个密码服务的一个或多个程序包。软件开发商根据一定接口,将各种算法实现后,打包成一个提供器,用户可以安装不同的提供器。安装和配置提供器,可将包含提供器的ZIP和JAR文件放在CLASSPATH下,再编辑Java安全属性文件来设置定义一个提供器。Java运行环境Sun版本时, 提供一个缺省的提供器Sun。
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,便能更进一步提高数据的保密性。
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
/**
* DES加密解密工具类
* @author Front.Tang [Front.Tang@qq.com]
* @version 2012-5-14 上午09:32:43
*/
public class DESEncrypt {
private static final String PASSWORD_CRYPT_KEY = "Front.Tang";
private static final String DES = "DES";
/**
* DES加密
* @param src 要加密的数据
* @param key 加密取用的key。八位字符串
* @return
* @throws Exception
*/
public static String encrypt(String src, String key){
if(key==null||key.length()==0) {
key = PASSWORD_CRYPT_KEY;
}
byte bb[] = null;
String result = null;
try {
Cipher cipher = getCipher(Cipher.ENCRYPT_MODE,key);
// 正式执行加密操作
bb = cipher.doFinal(src.getBytes());
result = Byte2Hex(bb);
} catch(Exception e) {
result = null;
}
return result;
}
/**
* DES解密
* @param src 要解密的数据源
* @param key 加密时取用的key,八位字符串
* @return
* @throws Exception
*/
public static String decrypt(String src, String key) {
if(key==null||key.length()==0) {
key = PASSWORD_CRYPT_KEY;
}
byte[] result = null;
Cipher cipher = null;
try {
result = String2Byte(src);
cipher = getCipher(Cipher.DECRYPT_MODE,key);
// 现在,获取数据并解密
// 正式执行解密操作
return new String(cipher.doFinal(result));
} catch(Exception e) {
return null;
}
}
/**
* 根据 mode 和 key 初始化Cipher对象
* @param mode 加密还是解密
* @param key 密匙
* @return Cipher对象
* @throws Exception
*/
public static Cipher getCipher(int mode,String key) throws Exception {
// DES算法要求有一个可信任的随机数源
SecureRandom sr = new SecureRandom();
// 从原始密匙数据创建一个DESKeySpec对象
DESKeySpec dks = new DESKeySpec(key.getBytes());
// 创建一个密匙工厂,然后用它把DESKeySpec对象转换成
// 一个SecretKey对象
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);
SecretKey securekey = keyFactory.generateSecret(dks);
// Cipher对象实际完成解密操作
Cipher cipher = Cipher.getInstance(DES);
// 用密匙初始化Cipher对象
cipher.init(mode, securekey, sr);
return cipher;
}
/**
* 将byte[] 转成 hex 字符串
* @param bb byte数组
* @return
*/
public static String Byte2Hex(byte[] bb) {
StringBuilder buff = new StringBuilder(bb.length);
String sTemp;
for(int i=0;i<bb.length;i++){
sTemp = Integer.toHexString(0xFF &bb[i]);
if(sTemp.length()<2){
buff.append(0);
}
buff.append(sTemp.toUpperCase());
}
return buff.toString();
}
/**
* 字符串转换成byte[]
* @param src 要转换的字符串
* @return
*/
public static byte[] String2Byte(String src) {
int len = (src.length()/2);
byte [] result = new byte[len];
char[] achar = src.toString().toCharArray();
for(int j=0;j<len;j++){
int pos = j*2;
result[j]= ((byte)(Char2Byte(achar[pos])<<4|Char2Byte(achar[pos+1])));
}
return result;
}
/**
* 字符转成byte
* @param c
* @return
*/
private static byte Char2Byte(char c){
byte b = (byte)"0123456789ABCDEF".indexOf(c);
return b;
}
public static void main(String[] args) throws Exception {
System.out.println(encrypt("Front.Tang",PASSWORD_CRYPT_KEY));
System.out.println(decrypt("A7F816CFE0A431F921A2812309EB95A2", PASSWORD_CRYPT_KEY));
}
}