import javax.crypto.Cipher;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.IvParameterSpec;
import java.security.Key;
import java.text.SimpleDateFormat;
import java.util.Base64;
import java.util.Date; public class DESUtil { /**
* 偏移变量,固定占8位字节
*/
private final static String IV_PARAMETER = "12345678";
/**
* 密钥算法
*/
private static final String ALGORITHM = "DES";
/**
* 加密/解密算法-工作模式-填充模式
*/
private static final String CIPHER_ALGORITHM = "DES/CBC/PKCS5Padding";
/**
* 默认编码
*/
private static final String CHARSET = "utf-8"; private static SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); /**
* 生成key
*
* @param password
* @return
* @throws Exception
*/
private static Key generateKey(String password) throws Exception {
DESKeySpec dks = new DESKeySpec(password.getBytes(CHARSET));
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM);
return keyFactory.generateSecret(dks);
} /**
* DES加密字符串
*
* @param password 加密密码,长度不能够小于8位
* @param data 待加密字符串
* @return 加密后内容
*/
public static String encrypt(String password, String data) {
if (password== null || password.length() < 8) {
throw new RuntimeException("加密失败,key不能小于8位");
}
if (data == null)
return null;
try {
Key secretKey = generateKey(password);
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
IvParameterSpec iv = new IvParameterSpec(IV_PARAMETER.getBytes(CHARSET));
cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);
byte[] bytes = cipher.doFinal(data.getBytes(CHARSET)); //JDK1.8及以上可直接使用Base64,JDK1.7及以下可以使用BASE64Encoder
//Android平台可以使用android.util.Base64
return new String(Base64.getEncoder().encode(bytes)); } catch (Exception e) {
e.printStackTrace();
return data;
}
} /**
* DES解密字符串
*
* @param password 解密密码,长度不能够小于8位
* @param data 待解密字符串
* @return 解密后内容
*/
public static String decrypt(String password, String data) {
if (password== null || password.length() < 8) {
throw new RuntimeException("加密失败,key不能小于8位");
}
if (data == null)
return null;
try {
Key secretKey = generateKey(password);
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
IvParameterSpec iv = new IvParameterSpec(IV_PARAMETER.getBytes(CHARSET));
cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);
return new String(cipher.doFinal(Base64.getDecoder().decode(data.getBytes(CHARSET))), CHARSET);
} catch (Exception e) {
e.printStackTrace();
return data;
}
} /**
* 解密
* @param data
* @return
*/
public static String decryptionKey(String data){
String format = sdf.format(new Date());
String decrypt = decrypt(format,data);
return decrypt;
} /**
* 加密
* @param data
* @return
*/
public static String encryptionKey(String data){
String format = sdf.format(new Date());
String encrypt = encrypt(format,data);
return encrypt;
} public static void main(String[] args) {
System.out.println(encryptionKey("100"));
}
}

  

最新文章

  1. BQ24296充电管理芯片使用过程中的注意事项
  2. [转]在iOS项目中使用CorePlot框架
  3. 小记:利用递归调用循环寻找MP3文件的方法。
  4. java继承和多态
  5. How to change the property of a control from a flowlayoutpanel?
  6. swift字典集合-备
  7. 递归:汉诺塔 - 零基础入门学习Python024
  8. 【图像识别】 图像处理和图像分析(leptonica)leptonica-1.68安装配置 (vs2008)
  9. PDF 补丁丁 0.5 正式版发布
  10. Struts2学习笔记整理(二)
  11. org.hibernate.ObjectNotFoundException: No row with the given identifier exists解决办法
  12. Cpp Generals 1.2
  13. Kinect外包团队— 2016中国VR开发者论坛第一期
  14. JAVA核心技术I---JAVA基础知识(单例模式和final关键字)
  15. 11.8Django中的组件content_type
  16. inotify-tools命令使用讲解
  17. 算法笔记--st表
  18. nyoj 魔法少女
  19. 使用 Nginx 提升网站访问速度
  20. WinForm------如何修改PanelControl控件背景色

热门文章

  1. .NET 6 + Hangfire 实现后台作业管理
  2. Java面向对象之封装详解
  3. 2022-05-31内部群每日三题-清辉PMP
  4. 2022-05-05内部群每日三题-清辉PMP
  5. ts面试题
  6. 【Linux】ArchLinux 使用之旅
  7. 创建异步倒计时触发Task
  8. vue-cli 根据不同的环境打包
  9. PhpSpreadsheet导出科学记数转成字符串
  10. react native 布局问题