import com.google.common.base.Preconditions;import lombok.Getter;import lombok.Setter;import lombok.SneakyThrows;import org.apache.commons.codec.binary.Base64;import org.apache.commons.codec.binary.StringUtils;import org.apache.commons.codec.digest.DigestUtils;import org.apache.shardingsphere.encrypt.strategy.spi.Encryptor;import javax.crypto.Cipher;import javax.crypto.NoSuchPaddingException;import javax.crypto.spec.SecretKeySpec;import java.nio.charset.StandardCharsets;import java.security.InvalidKeyException;import java.security.NoSuchAlgorithmException;import java.util.Arrays;import java.util.Properties;/*** AES encryptor.*/@Getter@Setterpublic final class AESEncryptor implements Encryptor {private static final String AES_KEY = "aes.key.value";private Properties properties = new Properties();@Overridepublic String getType() {return "AES";}@Overridepublic void init() {}@Override@SneakyThrowspublic String encrypt(final Object plaintext) {if (null == plaintext) {return null;}byte[] result = getCipher(Cipher.ENCRYPT_MODE).doFinal(StringUtils.getBytesUtf8(String.valueOf(plaintext)));return Base64.encodeBase64String(result);}@Override@SneakyThrowspublic Object decrypt(final String ciphertext) {if (null == ciphertext) {return null;}byte[] result = getCipher(Cipher.DECRYPT_MODE).doFinal(Base64.decodeBase64(ciphertext));return new String(result, StandardCharsets.UTF_8);}private Cipher getCipher(final int decryptMode) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException {Preconditions.checkArgument(properties.containsKey(AES_KEY), "No available secret key for `%s`.", AESEncryptor.class.getName());Cipher result = Cipher.getInstance(getType());result.init(decryptMode, new SecretKeySpec(createSecretKey(), getType()));return result;}private byte[] createSecretKey() {Preconditions.checkArgument(null != properties.get(AES_KEY), String.format("%s can not be null.", AES_KEY));return Arrays.copyOf(DigestUtils.sha1(properties.get(AES_KEY).toString()), 16);}}
我自己的
<dependency><groupId>org.apache.directory.studio</groupId><artifactId>org.apache.commons.codec</artifactId><version>1.8</version></dependency>
import lombok.experimental.UtilityClass;import javax.crypto.Cipher;import javax.crypto.KeyGenerator;import javax.crypto.spec.SecretKeySpec;import java.nio.charset.StandardCharsets;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;import org.apache.commons.codec.binary.Base64;import org.apache.commons.lang3.StringUtils;import sun.misc.BASE64Decoder;/*** @author zhouzhenyong* @since 2019/2/22 下午11:20*/@UtilityClasspublic class EncryptUtil {/*** 算法*/public final String ALGORITHMSTR = "AES/ECB/PKCS5Padding";/*** 传入文本内容,返回 encrypt-256 串** @param strText 待加密文本* @return 加密之后的文本*/public String sha256(final String strText) {return encrypt(strText, "SHA-256");}/*** 传入文本内容,返回 encrypt-512 串* @param strText 待加密文本* @return 加密之后的文本*/public String sha512(final String strText) {return encrypt(strText, "SHA-512");}/*** 传入文本内容,返回 MD5 串* @param strText 待加密文本* @return 加密之后的文本*/public String md5(final String strText){return encrypt(strText, "MD5");}/*** base 64 encode* @param bytes 待编码的byte[]* @return 编码后的base 64 code*/public String base64Encode(byte[] bytes){return Base64.encodeBase64String(bytes);}/*** base 64 decode* @param base64Code 待解码的base 64 code* @return 解码后的byte[]* @throws Exception 抛出异常*/public byte[] base64Decode(String base64Code) throws Exception{return StringUtils.isEmpty(base64Code) ? null : new BASE64Decoder().decodeBuffer(base64Code);}/*** AES加密* @param content 待加密的内容* @param key 加密密钥* @return 加密后的byte[]*/public byte[] aesEncryptToBytes(String content, String key) throws Exception {KeyGenerator generator = KeyGenerator.getInstance("AES");generator.init(128);Cipher cipher = Cipher.getInstance(ALGORITHMSTR);cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key.getBytes(), "AES"));return cipher.doFinal(content.getBytes(StandardCharsets.UTF_8));}/*** AES加密为base 64 code** @param content 待加密的内容* @param encryptKey 加密密钥* @return 加密后的base 64 code*/public String aesEncrypt(String content, String encryptKey) throws Exception {return base64Encode(aesEncryptToBytes(content, encryptKey));}/*** AES解密** @param encryptBytes 待解密的byte[]* @param key 解密密钥* @return 解密后的String*/public String aesDecryptFromBytes(byte[] encryptBytes, String key) throws Exception {KeyGenerator generator = KeyGenerator.getInstance("AES");generator.init(128);Cipher cipher = Cipher.getInstance(ALGORITHMSTR);cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key.getBytes(), "AES"));byte[] decryptBytes = cipher.doFinal(encryptBytes);return new String(decryptBytes);}/*** 将base 64 code AES解密** @param encryptStr 待解密的base 64 code* @param key 解密密钥* @return 解密后的string*/public String aesDecrypt(String encryptStr, String key) throws Exception {return StringUtils.isEmpty(encryptStr) ? null : aesDecryptFromBytes(base64Decode(encryptStr), key);}/*** 字符串 encrypt 加密* @param str 待加密文本* @param strType 加密类型* @return 加密之后的文本*/private String encrypt(final String str, final String strType) {MessageDigest messageDigest;String encodeStr = "";if (null == str || str.length() == 0) {return encodeStr;}try {messageDigest = MessageDigest.getInstance(strType);messageDigest.update(str.getBytes());// 将byte 转换为字符展示出来StringBuilder stringBuffer = new StringBuilder();String temp;for (byte aByte : messageDigest.digest()) {temp = Integer.toHexString(aByte & 0xFF);if (temp.length() == 1) {//1得到一位的进行补0操作stringBuffer.append("0");}stringBuffer.append(temp);}encodeStr = stringBuffer.toString();} catch (NoSuchAlgorithmException e) {throw new RuntimeException(e);}return encodeStr;}}
DesUtil
import lombok.experimental.UtilityClass;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;/*** @author shizi* @since 2021-11-22 17:00:24*/@UtilityClasspublic 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";/*** 生成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.Base64return 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;}}}
