最近项目需要保存密码,对于客户来说 密码对他来说是透明的! 也就是说密码保存的时候加密,取的时候又需要解密! 所以用 DES!
主要是将碰到的问题 列出来记录下!
1:加密得出的byte数组 直接解密是ok的!
2:加密得出的byte数组,通过utf-8 转成string (new String(bytes,"utf-8")); 再 str.getBytes("utf-8") 再解密 就会报错! 什么 密钥要是8 的倍数 !今天想再重现 没重现成功 但是报了个别的错误
Exception in thread "main" java.lang.RuntimeException: decrypt occurred exception
其实就是解密失败了!
3:如果加密得到的结果 循环 byte转成 char 然后拼成 string 再 string 转成byte 是解密成功的
所以问题出在了 byte转成string 上面了! 可是为什么呢? 其实我也不知道 ,但是我试验出来了 原因
因为 解密出来的byte 数组里面有负数
昨天的解决办法是 先base64加密 然后就好了 呵呵呵!
package com.sinitek.sfm.trade.dbn.utils;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import java.security.SecureRandom;
/*
* Created with IntelliJ IDEA.
* User: xn-hyao-01
* Date: 14-4-15
* Time: 下午4:48
* To change this template use File | Settings | File Templates
*/
public class DESUtils {
/**
* log
*/
private static final Logger LOGGER = Logger.getLogger(DESUtils.class);
/**
* 密钥 siniteke
*/
private static final byte[] DES_KEY = new byte[]{115, 105, 110, 105, 116, 101, 107, 101};
/**
* 加密
*
* @param dataSource
* @return
*/
public static String encrypt(String dataSource) {
LOGGER.debug("need to encrypt is " + dataSource);
String result = "";
try {
if (StringUtils.isNotBlank(dataSource)) {
// DES算法要求有一个可信任的随机数源
SecureRandom random = new SecureRandom();
// 创建一个DESKeySpec对象
DESKeySpec desKey = new DESKeySpec(DES_KEY);
//创建一个密匙工厂,然后用它把DESKeySpec转换成
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey securekey = keyFactory.generateSecret(desKey);
//Cipher对象实际完成加密操作
Cipher cipher = Cipher.getInstance("DES");
//用密匙初始化Cipher对象
cipher.init(Cipher.ENCRYPT_MODE, securekey, random);
//现在,获取数据并加密
//正式执行加密操作
byte[] bytes = cipher.doFinal(dataSource.getBytes("utf-8"));
//base64加密成字符串
BASE64Encoder base64Encoder = new BASE64Encoder();
//base64加密的结果
result = base64Encoder.encode(bytes);
}
} catch (Exception ex) {
LOGGER.error("encrypt occurred exception ", ex);
throw new RuntimeException("encrypt occurred exception");
}
LOGGER.debug("encrypt result is " + result);
return result;
}
/**
* 解密
*
* @param src
* @return
* @throws Exception
*/
public static String decrypt(String src) {
LOGGER.debug("need to decrypt is " + src);
String result = "";
try {
if (StringUtils.isNotBlank(src)) {
//base64解密
BASE64Decoder base64Decoder = new BASE64Decoder();
//解密
byte[] bytes = base64Decoder.decodeBuffer(src);
// DES算法要求有一个可信任的随机数源
SecureRandom random = new SecureRandom();
// 创建一个DESKeySpec对象
DESKeySpec desKey = new DESKeySpec(DES_KEY);
// 创建一个密匙工厂
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
// 将DESKeySpec对象转换成SecretKey对象
SecretKey securekey = keyFactory.generateSecret(desKey);
// Cipher对象实际完成解密操作
Cipher cipher = Cipher.getInstance("DES");
// 用密匙初始化Cipher对象
cipher.init(Cipher.DECRYPT_MODE, securekey, random);
// 真正开始解密操作
byte[] cipherBytes = cipher.doFinal(bytes);
//结果
result = new String(cipherBytes);
}
} catch (Exception ex) {
LOGGER.error("decrypt occurred exception ", ex);
throw new RuntimeException("decrypt occurred exception");
}
LOGGER.debug("decrypt result is " + result);
return result;
}
public static void main(String[] args) {
String str = "131313";
String encrypt = encrypt(str);
System.out.println(encrypt);
String cryptStr = new String(decrypt(encrypt));
System.out.println(cryptStr);
}
}