package com.nova.sankuai.infra.utils.baofu; import org.apache.commons.lang.StringUtils; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESKeySpec; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.security.MessageDigest; public class SecurityUtil { /*** * MD5 加密 */ public static String MD5(String str) { if (str == null) return null; try { MessageDigest md5 = MessageDigest.getInstance("MD5"); md5.update(str.getBytes("UTF-8")); byte[] digest = md5.digest(); StringBuffer hexString = new StringBuffer(); String strTemp; for (int i = 0; i < digest.length; i++) { strTemp = Integer.toHexString((digest[i] & 0x000000FF) | 0xFFFFFF00).substring(6); hexString.append(strTemp); } return hexString.toString(); } catch (Exception e) { e.printStackTrace(); } return str; } // ==Base64加解密================================================================== /** * Base64加密 */ public static String Base64Encode(String str) throws UnsupportedEncodingException { return new BASE64Encoder().encode(str.getBytes("UTF-8")); } /** * 解密 */ public static String Base64Decode(String str) throws UnsupportedEncodingException, IOException { // str = str.replaceAll(" ", "+"); return new String(new BASE64Decoder().decodeBuffer(str), "UTF-8"); } // ==Aes加解密================================================================== /** * aes解密-128位 */ public static String AesDecrypt(String encryptContent, String password) { if (StringUtils.isEmpty(password) || password.length() != 16) { throw new RuntimeException("密钥长度为16位"); } try { String key = password; String iv = password; byte[] encrypted1 = hex2Bytes(encryptContent); Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding"); SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES"); IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes()); cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec); byte[] original = cipher.doFinal(encrypted1); return new String(original,"UTF-8").trim(); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException("aes解密发生错误", e); } } /** * aes加密-128位 * */ public static String AesEncrypt(String content ,String key){ if (StringUtils.isEmpty(key) || key.length() != 16) { throw new RuntimeException("密钥长度为16位"); } try { String iv = key; Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding"); int blockSize = cipher.getBlockSize(); byte[] dataBytes = content.getBytes("utf-8"); int plaintextLength = dataBytes.length; if (plaintextLength % blockSize != 0) { plaintextLength = plaintextLength + (blockSize - (plaintextLength % blockSize)); } byte[] plaintext = new byte[plaintextLength]; System.arraycopy(dataBytes, 0, plaintext, 0, dataBytes.length); SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES"); IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes()); //Log.Write("KEY:"+FormatUtil.bytesToHexString(keyspec.getEncoded())); //Log.Write("KEY:"+FormatUtil.bytesToHexString(ivspec.getIV())); cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec); byte[] encrypted = cipher.doFinal(plaintext); return byte2Hex(encrypted); } catch (Exception e) { throw new RuntimeException("aes加密发生错误", e); } } /** * 将byte[] 转换成字符串 */ public static String byte2Hex(byte[] srcBytes) { StringBuilder hexRetSB = new StringBuilder(); for (byte b : srcBytes) { String hexString = Integer.toHexString(0x00ff & b); hexRetSB.append(hexString.length() == 1 ? 0 : "").append(hexString); } return hexRetSB.toString(); } /** * 将16进制字符串转为转换成字符串 */ public static byte[] hex2Bytes(String source) { byte[] sourceBytes = new byte[source.length() / 2]; for (int i = 0; i < sourceBytes.length; i++) { sourceBytes[i] = (byte) Integer.parseInt(source.substring(i * 2, i * 2 + 2), 16); } return sourceBytes; } /** * DES加密 */ public static String desEncrypt(String source, String desKey) throws Exception { try { // 从原始密匙数据创建DESKeySpec对象 SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); SecretKey securekey = keyFactory.generateSecret(new DESKeySpec(desKey.getBytes())); // Cipher对象实际完成加密操作 Cipher cipher = Cipher.getInstance("DES"); // 用密匙初始化Cipher对象 cipher.init(Cipher.ENCRYPT_MODE, securekey); // 现在,获取数据并加密 byte[] destBytes = cipher.doFinal(source.getBytes()); StringBuilder hexRetSB = new StringBuilder(); for (byte b : destBytes) { String hexString = Integer.toHexString(0x00ff & b); hexRetSB.append(hexString.length() == 1 ? 0 : "").append(hexString); } return hexRetSB.toString(); } catch (Exception e) { throw new Exception("DES加密发生错误", e); } } /** * DES解密 */ public static String desDecrypt(String source, String desKey) throws Exception { // 解密数据 byte[] sourceBytes = new byte[source.length() / 2]; for (int i = 0; i < sourceBytes.length; i++) { sourceBytes[i] = (byte) Integer.parseInt(source.substring(i * 2, i * 2 + 2), 16); } try { SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); SecretKey securekey = keyFactory.generateSecret(new DESKeySpec(desKey.getBytes())); Cipher cipher = Cipher.getInstance("DES"); // 用密匙初始化Cipher对象 cipher.init(Cipher.DECRYPT_MODE, securekey); // 现在,获取数据并解密 byte[] destBytes = cipher.doFinal(sourceBytes); return new String(destBytes); } catch (Exception e) { throw new Exception("DES解密发生错误", e); } } /** * 3DES加密 */ public static byte[] threeDesEncrypt(byte[] src, byte[] keybyte) throws Exception { try { // 生成密钥 byte[] key = new byte[24]; if (keybyte.length < key.length) { System.arraycopy(keybyte, 0, key, 0, keybyte.length); } else { System.arraycopy(keybyte, 0, key, 0, key.length); } SecretKey deskey = new SecretKeySpec(key, "DESede"); // 加密 Cipher c1 = Cipher.getInstance("DESede/ECB/PKCS5Padding"); c1.init(Cipher.ENCRYPT_MODE, deskey); return c1.doFinal(src); } catch (Exception e) { throw new Exception("3DES加密发生错误", e); } } /** * 3DES解密 */ public static byte[] threeDesDecrypt(byte[] src, byte[] keybyte) throws Exception { try { // 生成密钥 byte[] key = new byte[24]; if (keybyte.length < key.length) { System.arraycopy(keybyte, 0, key, 0, keybyte.length); } else { System.arraycopy(keybyte, 0, key, 0, key.length); } SecretKey deskey = new SecretKeySpec(key, "DESede"); // 解密 Cipher c1 = Cipher.getInstance("DESede/ECB/PKCS5Padding"); c1.init(Cipher.DECRYPT_MODE, deskey); return c1.doFinal(src); } catch (Exception e) { throw new Exception("3DES解密发生错误", e); } } /** * 3DES加密 */ public static String threeDesEncrypt(String src, String key) throws Exception { return byte2Hex(threeDesEncrypt(src.getBytes(), key.getBytes())); } /** * 3DES加密 */ public static String threeDesDecrypt(String src, String key) throws Exception { return new String(threeDesDecrypt(hex2Bytes(src), key.getBytes())); } /** * sha1计算后进行16进制转换 * * @param data 待计算的数据 * @param encoding 编码 * @return 计算结果 * @throws UnsupportedEncodingException */ public static String sha1X16(String data, String encoding) throws Exception { byte[] bytes = sha1(data.getBytes(encoding)); return byte2Hex(bytes); } /** * sha1计算. * * @param data 待计算的数据 * @return 计算结果 */ public static byte[] sha1(byte[] data) { MessageDigest md = null; try { md = MessageDigest.getInstance("SHA-1"); md.reset(); md.update(data); return md.digest(); } catch (Exception e) { e.printStackTrace(); return null; } } }