本文介绍了DES使用DES/CBC/PKCS5Padding填充模式进行加解密的过程,同时包含计算字符串的md5值
直接上代码:
/**
* 使用指定编码,获取指定字符串的md5值
*
* @param data 字符串
* @param encoding 编码
* @return md5值
*/
public static String md5Encode(String data, String encoding) {
try {
Digest digest = new MD5Digest();
digest.update(data.getBytes(encoding), 0, data.getBytes(encoding).length);
byte[] md5Bytes = new byte[digest.getDigestSize()];
digest.doFinal(md5Bytes, 0);
return Hex.encodeHexString(md5Bytes);
} catch (UnsupportedEncodingException e) {
logger.error("异常",e);
return null;
}
}
/**
* 使用指定的key对字符串加密
*
* @param data 待加密字符串
* @param key 密钥
* @return 加密后的数据
*/
public static String encrypt(String data, String key) {
byte[] bt = new byte[0];
String encodeData = "";
try {
bt = encrypt(data.getBytes(CHARSET_UTF8), key.getBytes(CHARSET_UTF8));
//字节转化为16进制字符串
encodeData = byteToHexString(bt);
} catch (Exception e) {
logger.error("异常",e);
}
return encodeData;
}
private static byte[] encrypt(byte[] data, byte[] key) throws Exception {
SecureRandom sr = new SecureRandom();
DESKeySpec dks = new DESKeySpec(key);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);
SecretKey securekey = keyFactory.generateSecret(dks);
Cipher cipher = Cipher.getInstance(PKCS_5_PADDING);
cipher.init(Cipher.ENCRYPT_MODE, securekey, new IvParameterSpec(dks.getKey()));
return cipher.doFinal(data);
}
/**
*
* 将byte数组转换成16进制字符串
*
* @param bytes byte数组
* @return 16进制字符串
*/
public static String byteToHexString(byte[] bytes) {
StringBuffer sb = new StringBuffer(bytes.length);
String sTemp;
for (int i = 0; i < bytes.length; i++) {
sTemp = Integer.toHexString(0xFF & bytes[i]);
if (sTemp.length() < 2) {
sb.append(0);
}
sb.append(sTemp.toUpperCase());
}
return sb.toString();
}
/**
*
* @param data
* @param key
* @return
*/
public static String decrypt(String data, String key) {
String decryptString = "";
try {
byte[] bt = decrypt(hexStringToBytes(data), key.getBytes(CHARSET_UTF8));
decryptString = new String(bt, CHARSET_UTF8);
} catch (Exception e) {
logger.error("异常",e);
}
return decryptString;
}
/**
* 解密
* @param data byte数组
* @param key 加密key
* @return 解密后的byte数组
* @throws Exception 异常
*/
private static byte[] decrypt(byte[] data, byte[] key) throws Exception {
SecureRandom sr = new SecureRandom();
DESKeySpec dks = new DESKeySpec(key);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);
SecretKey securekey = keyFactory.generateSecret(dks);
// Cipher对象实际完成解密操作
Cipher cipher = Cipher.getInstance(PKCS_5_PADDING);
// 用密钥初始化Cipher对象
cipher.init(Cipher.DECRYPT_MODE, securekey, new IvParameterSpec(dks.getKey()));
return cipher.doFinal(data);
}
/**
* 将16进制字符串转换为byte[]
*
* @param str 待转字符串
* @return 转后的byte数组
*/
public static byte[] hexStringToBytes(String str) {
if (str == null || str.trim().equals("")) {
return new byte[0];
}
byte[] bytes = new byte[str.length() / 2];
for (int i = 0; i < str.length() / 2; i++) {
String subStr = str.substring(i * 2, i * 2 + 2);
bytes[i] = (byte) Integer.parseInt(subStr, 16);
}
return bytes;
}
执行main方法,验证
/**
* 加密方式 DES
*/
private final static String DES = "DES";
/**
* 填充模式 DES/CBC/PKCS5Padding
*/
private final static String PKCS_5_PADDING = "DES/CBC/PKCS5Padding";
/**
* 字符编码 UTF-8
*/
static final String CHARSET_UTF8 = "UTF-8";
public static void main(String[] args) {
String data = "good good study,day day up";
String key = "P0e5FGMl8VNukjGWqIf4LnmEdUnMyyGvsbzEt4gWelIrpSQDX7EX4kncpJUPbjDf";
String md5String = md5Encode(data,CHARSET_UTF8);
System.out.println("md5:" + md5String);
String desString = encrypt(data,key);
System.out.println("DES:" + desString);
String decodeString = decrypt(desString,key);
System.out.println(decodeString);
}
控制台输出如下:
md5:d656aead64940dbf9ec40a070de756ed
DES:7AB164197D530D0C41BFDB321F41E53F7A47946CA8DC4954A0A5589944999428
good good study,day day up
本示例程序使用maven进行构建,需要引用相关的jar包依赖,如下:
<dependency>
<groupId>org.bouncycastlegroupId>
<artifactId>bcprov-jdk15onartifactId>
<version>1.60version>
dependency>
<dependency>
<groupId>commons-langgroupId>
<artifactId>commons-langartifactId>
<version>2.6version>
dependency>
<dependency>
<groupId>commons-codecgroupId>
<artifactId>commons-codecartifactId>
<version>1.13version>
dependency>
<dependency>
<groupId>org.slf4jgroupId>
<artifactId>slf4j-apiartifactId>
<version>1.7.30version>
dependency>