
com.hecloud.runtime.common.encryptor.DESEncrptor Maven / Gradle / Ivy
package com.hecloud.runtime.common.encryptor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.Key;
import java.security.SecureRandom;
import java.util.Optional;
/**
* 加密器接口实现
*
* @author LoveinBJ
* @version 1.0
* @since 2016.08.05
*/
public class DESEncrptor implements Encryptor {
/**
* DES 算法
* 可替换为以下任意一种算法,同时key值的size相应改变。
*
*
* DES key size must be equal to 56
* DESede(TripleDES) key size must be equal to 112 or 168
* AES key size must be equal to 128, 192 or 256,but 192 and 256 bits may not be available
* Blowfish key size must be multiple of 8, and can only range from 32 to 448 (inclusive)
* RC2 key size must be between 40 and 1024 bits
* RC4(ARCFOUR) key size must be between 40 and 1024 bits
*
*/
private static final String ALGORITHM = "DES";
private static Logger logger = LoggerFactory.getLogger(DESEncrptor.class);
@Override
public String encrypt(String data, String key) throws Exception {
byte[] mask = encrypt(data.getBytes(StandardCharsets.ISO_8859_1), key);
mask = Optional.ofNullable(mask).orElseThrow(() -> new Exception("加密失败!"));
return Base64Coder.encode(mask);
}
@Override
public String decrypt(String cipherText, String key) throws Exception {
byte[] buffer = decrypt(Base64Coder.decode(cipherText.toCharArray()), key);
buffer = Optional.ofNullable(buffer).orElseThrow(() -> new Exception("解密异常!"));
return new String(buffer, StandardCharsets.UTF_8);
}
@Override
public byte[] encrypt(byte[] data, String key) {
try {
SecureRandom random = new SecureRandom();
DESKeySpec desKey = new DESKeySpec(key.getBytes());
// 创建一个密匙工厂,然后用它把DESKeySpec转换成
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM);
SecretKey secretKey = keyFactory.generateSecret(desKey);
// Cipher对象实际完成加密操作
Cipher cipher = Cipher.getInstance(ALGORITHM);
// 用密匙初始化Cipher对象
cipher.init(Cipher.ENCRYPT_MODE, secretKey, random);
// 正式执行加密操作
return cipher.doFinal(data);
} catch (Throwable e) {
logger.error("加密失败!", e);
return null;
}
}
@Override
public byte[] decrypt(byte[] cipherText, String key) {
try {
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, generateKey(key.getBytes()));
return cipher.doFinal(cipherText);
} catch (Exception e) {
logger.error("Decrypt ERROR:", e);
return null;
}
}
/**
* DES 算法转换密钥
*
* @param key 密钥数据
* @return key Key对象
* @throws Exception 运行异常
*/
private Key generateKey(byte[] key) throws Exception {
SecretKey secretKey;
if (ALGORITHM.equals(DEFAULT.DES.name()) || ALGORITHM.equals(DEFAULT.DESede.name())) {
DESKeySpec dkSpec = new DESKeySpec(key);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM);
secretKey = keyFactory.generateSecret(dkSpec);
} else {
// 当使用其他对称加密算法时,如AES、Blowfish等算法时,用下述代码替换上述三行代码
secretKey = new SecretKeySpec(key, ALGORITHM);
}
return secretKey;
}
/**
* 默认算法
*
* @author LoveinBJ
*/
public enum DEFAULT {
/**
*
*/
DES,
/**
*
*/
DESede
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy