You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
100 lines
3.0 KiB
100 lines
3.0 KiB
/** |
|
* Copyright (C) 2018-2022 |
|
* All rights reserved, Designed By www.yixiang.co |
|
|
|
*/ |
|
package co.yixiang.utils; |
|
|
|
import org.springframework.util.DigestUtils; |
|
|
|
import javax.crypto.Cipher; |
|
import javax.crypto.SecretKey; |
|
import javax.crypto.SecretKeyFactory; |
|
import javax.crypto.spec.DESKeySpec; |
|
import javax.crypto.spec.IvParameterSpec; |
|
import java.nio.charset.StandardCharsets; |
|
|
|
/** |
|
* 加密 |
|
* @author Zheng Jie |
|
* @date 2018-11-23 |
|
*/ |
|
public class EncryptUtils { |
|
|
|
private static String strParam = "Passw0rd"; |
|
|
|
private static Cipher cipher; |
|
|
|
private static IvParameterSpec iv = new IvParameterSpec(strParam.getBytes(StandardCharsets.UTF_8)); |
|
|
|
private static DESKeySpec getDesKeySpec(String source) throws Exception { |
|
if (source == null || source.length() == 0){ |
|
return null; |
|
} |
|
cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); |
|
String strKey = "Passw0rd"; |
|
return new DESKeySpec(strKey.getBytes(StandardCharsets.UTF_8)); |
|
} |
|
|
|
/** |
|
* 对称加密 |
|
*/ |
|
public static String desEncrypt(String source) throws Exception { |
|
DESKeySpec desKeySpec = getDesKeySpec(source); |
|
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); |
|
SecretKey secretKey = keyFactory.generateSecret(desKeySpec); |
|
cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv); |
|
return byte2hex( |
|
cipher.doFinal(source.getBytes(StandardCharsets.UTF_8))).toUpperCase(); |
|
} |
|
|
|
/** |
|
* 对称解密 |
|
*/ |
|
public static String desDecrypt(String source) throws Exception { |
|
byte[] src = hex2byte(source.getBytes()); |
|
DESKeySpec desKeySpec = getDesKeySpec(source); |
|
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); |
|
SecretKey secretKey = keyFactory.generateSecret(desKeySpec); |
|
cipher.init(Cipher.DECRYPT_MODE, secretKey, iv); |
|
byte[] retByte = cipher.doFinal(src); |
|
return new String(retByte); |
|
} |
|
|
|
private static String byte2hex(byte[] inStr) { |
|
String stmp; |
|
StringBuilder out = new StringBuilder(inStr.length * 2); |
|
for (byte b : inStr) { |
|
stmp = Integer.toHexString(b & 0xFF); |
|
if (stmp.length() == 1) { |
|
// 如果是0至F的单位字符串,则添加0 |
|
out.append("0").append(stmp); |
|
} else { |
|
out.append(stmp); |
|
} |
|
} |
|
return out.toString(); |
|
} |
|
|
|
private static byte[] hex2byte(byte[] b) { |
|
int size = 2; |
|
if ((b.length % size) != 0){ |
|
throw new IllegalArgumentException("长度不是偶数"); |
|
} |
|
byte[] b2 = new byte[b.length / 2]; |
|
for (int n = 0; n < b.length; n += size) { |
|
String item = new String(b, n, 2); |
|
b2[n / 2] = (byte) Integer.parseInt(item, 16); |
|
} |
|
return b2; |
|
} |
|
|
|
/** |
|
* 密码加密 |
|
* @param password |
|
* @return |
|
*/ |
|
public static String encryptPassword(String password){ |
|
return DigestUtils.md5DigestAsHex(password.getBytes()); |
|
} |
|
}
|
|
|