|
|
@@ -0,0 +1,129 @@
|
|
|
+package com.ruoyi.aicall.utils;
|
|
|
+
|
|
|
+import com.ruoyi.common.utils.DateUtils;
|
|
|
+
|
|
|
+import javax.crypto.Cipher;
|
|
|
+import javax.crypto.SecretKeyFactory;
|
|
|
+import javax.crypto.spec.DESKeySpec;
|
|
|
+import javax.crypto.spec.IvParameterSpec;
|
|
|
+import java.security.Key;
|
|
|
+import java.util.Base64;
|
|
|
+import java.util.Date;
|
|
|
+
|
|
|
+public class DESUtil {
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 密钥算法
|
|
|
+ */
|
|
|
+ private static final String ALGORITHM = "DES";
|
|
|
+ /**
|
|
|
+ * 加密/解密算法-工作模式-填充模式
|
|
|
+ */
|
|
|
+ private static final String CIPHER_ALGORITHM = "DES/CBC/PKCS5Padding";
|
|
|
+ /**
|
|
|
+ * 默认编码
|
|
|
+ */
|
|
|
+ private static final String CHARSET = "utf-8";
|
|
|
+ /**
|
|
|
+ * 默认加密key
|
|
|
+ */
|
|
|
+ private static final String DEFAULT_KEY = "telebo@t";
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 生成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);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 使用默认key加密
|
|
|
+ * @param data
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static String encrypt(String data) {
|
|
|
+ return encrypt(DEFAULT_KEY, data);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 使用默认key解密
|
|
|
+ * @param data
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static String decrypt(String data) throws Throwable {
|
|
|
+ return decrypt(DEFAULT_KEY, data);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 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(password.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) throws Throwable {
|
|
|
+ if (password == null || password.length() < 8) {
|
|
|
+ throw new RuntimeException("加密失败,key不能小于8位");
|
|
|
+ }
|
|
|
+ if (data == null) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ Key secretKey = generateKey(password);
|
|
|
+ Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
|
|
|
+ IvParameterSpec iv = new IvParameterSpec(password.getBytes(CHARSET));
|
|
|
+ cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);
|
|
|
+ return new String(cipher.doFinal(Base64.getDecoder().decode(data.getBytes(CHARSET))), CHARSET);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void main(String[] args) throws Throwable {
|
|
|
+
|
|
|
+
|
|
|
+ String key = "telebo@t";
|
|
|
+ String output = encrypt(key, "fenjimima," + DateUtils.format(DateUtils.addDays(new Date(), 1), "yyyyMMddHHmm"));
|
|
|
+ System.out.println(output);
|
|
|
+
|
|
|
+ String output2 = decrypt(key, "CpKv9hXikAYqZKPvqb+5YXvAGwnmPVI8");
|
|
|
+ System.out.println(output2);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+}
|