今天coding的时候需要大数据大佬对接接口,接口用的DES加密 ECB的PKCS5Padding填充方式。从 XXX 看到的都是收费的,我就搞不明白了一个工具类至于收费不,我就有点不开心了。为什么就不能有一个分享的精神,程序员何必为难程序员呢。
今天我给大家分享三个我自己常用的三个加密工具类吧 。AES、DES、MD5
package cn.builder.util;
import org.apache.commons.codec.binary.Base64;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class AESUtil {
private static final String defaultCharset = "UTF-8";
private static final String KEY_AES = "AES";
private static final String KEY_MD5 = "MD5";
private static MessageDigest md5Digest;
static {
try {
md5Digest = MessageDigest.getInstance(KEY_MD5);
} catch (NoSuchAlgorithmException e) {
}
}
//加密方法使用示例:
public static void main(String[] args) throws Exception {
String key = "KingYiFan";
String data = "{
"name": "",
"valid": "",
"audioNum": "",
"buyNum": "",
"usedNum": "",
"startDate": "",
"endDate": "",
"mid": "1",
"rid": "1",
"code": "1"
}";
String encrypted = AESUtil.encrypt(data, key);
String decrypted = AESUtil.decrypt(encrypted, key);
System.out.println("加密后的密文\n" + encrypted);
System.out.println("解密后的报文:\n" + decrypted);
}
/**
* 加密
*
* @param data 需要加密的内容
* @param key 加密密码
* @return
*/
public static String encrypt(String data, String key) {
return doAES(data, key, Cipher.ENCRYPT_MODE);
}
/**
* 解密
*
* @param data 待解密内容
* @param key 解密密钥
* @return
*/
public static String decrypt(String data, String key) {
return doAES(data, key, Cipher.DECRYPT_MODE);
}
/**
* 加解密
*
* @param data
* @param key
* @param mode
* @return
*/
private static String doAES(String data, String key, int mode) {
try {
boolean encrypt = mode == Cipher.ENCRYPT_MODE;
byte[] content;
if (encrypt) {
content = data.getBytes(defaultCharset);
} else {
content = Base64.decodeBase64(data.getBytes());
}
SecretKeySpec keySpec = new SecretKeySpec(md5Digest.digest(key.getBytes(defaultCharset))
, KEY_AES);
Cipher cipher = Cipher.getInstance(KEY_AES);// 创建密码器
cipher.init(mode, keySpec);// 初始化
byte[] result = cipher.doFinal(content);
if (encrypt) {
return new String(Base64.encodeBase64(result));
} else {
return new String(result, defaultCharset);
}
} catch (Exception e) {
}
return null;
}
}
package cn.builder.utils;
import sun.misc.BASE64Encoder;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import java.security.SecureRandom;
public class DESUtil {
//密码,长度要是8的倍数 注意此处为简单密码 简单应用 要求不高时可用此密码
private static String key = "King8888";
/**
* 加密
*
* @param datasource byte[]
* @param key String
* @return byte[]
*/
private static byte[] encryptByKey(byte[] datasource, String key) {
try {
SecureRandom random = new SecureRandom();
DESKeySpec desKey = new DESKeySpec(key.getBytes());
//创建一个密匙工厂,然后用它把DESKeySpec转换成
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey securekey = keyFactory.generateSecret(desKey);
//Cipher对象实际完成加密操作 ecb模式下面的PKCS5Padding
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
//用密匙初始化Cipher对象
cipher.init(Cipher.ENCRYPT_MODE, securekey, random);
//现在,获取数据并加密
//正式执行加密操作
return cipher.doFinal(datasource);
} catch (Throwable e) {
e.printStackTrace();
}
return null;
}
/**
* @param data
* @return
* @throws Exception
* @Method: encrypt
* @Description: 加密数据然后转成Base64
*/
public static String encrypt(String data) { //对string进行BASE64Encoder转换
byte[] bt = encryptByKey(data.getBytes(), key);
BASE64Encoder base64en = new BASE64Encoder();
String strs = new String(base64en.encode(bt));
return strs;
}
/**
* 解密
*
* @param src byte[]
* @param key String
* @return byte[]
* @throws Exception
*/
private static byte[] decrypt(byte[] src, String key) throws Exception {
// DES算法要求有一个可信任的随机数源
SecureRandom random = new SecureRandom();
// 创建一个DESKeySpec对象
DESKeySpec desKey = new DESKeySpec(key.getBytes());
// 创建一个密匙工厂
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
// 将DESKeySpec对象转换成SecretKey对象
SecretKey securekey = keyFactory.generateSecret(desKey);
// Cipher对象实际完成解密操作
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
// 用密匙初始化Cipher对象
cipher.init(Cipher.DECRYPT_MODE, securekey, random);
// 真正开始解密操作
return cipher.doFinal(src);
}
/**
* @param data
* @return
* @throws Exception
* @Method: decryptor
* @Description: 从Base64解密 在Des解密数据
*/
public static String decryptor(String data) throws Exception { //对string进行BASE64Encoder转换
sun.misc.BASE64Decoder base64en = new sun.misc.BASE64Decoder();
byte[] bt = decrypt(base64en.decodeBuffer(data), key);
String strs = new String(bt);
return strs;
}
//测试
public static void main(String args[]) {
//待加密内容
String str = "a=a01&&u=sa0keweid&&f=F002&&k=C0283&&t=20180801134532";
//加密串
String result = DESUtil.encrypt(str);
System.out.println("加密后:" + result);
try {
//直接将如上内容解密
String decryResult = DESUtil.decryptor(result);
System.out.println("解密后:" + new String(decryResult));
} catch (Exception e1) {
e1.printStackTrace();
}
}
}
package cn.builder.utils;
import java.security.MessageDigest;
import static java.nio.charset.StandardCharsets.UTF_8;
public class MD5Util {
private static final String HEX_DIGITS[] = {"0", "1", "2", "3", "4", "5",
"6", "7", "8", "9", "a", "b", "c", "d", "e", "f"};
public static String md5Encode(String origin, String charsetname) {
String resultString = null;
try {
resultString = origin;
MessageDigest md = MessageDigest.getInstance("MD5");
if (charsetname == null || "".equals(charsetname))
resultString = byteArrayToHexString(md.digest(resultString
.getBytes(UTF_8)));
else
resultString = byteArrayToHexString(md.digest(resultString
.getBytes(charsetname)));
} catch (Exception e) {
e.printStackTrace();
}
return resultString;
}
private static String byteArrayToHexString(byte b[]) {
StringBuffer resultSb = new StringBuffer();
for (int i = 0; i < b.length; i++)
resultSb.append(byteToHexString(b[i]));
return resultSb.toString();
}
private static String byteToHexString(byte b) {
int n = b;
if (n < 0)
n += 256;
int d1 = n / 16;
int d2 = n % 16;
return HEX_DIGITS[d1] + HEX_DIGITS[d2];
}
}
声明:以上三个工具类我已经亲测可用使用。有什么问题随时可用扣我。
鼓励作者写出更好的技术文档,就请我喝一瓶哇哈哈哈哈哈哈哈。。
微信:
支付宝:
感谢一路支持我的人。。。。。
Love me and hold me
QQ:69673804(16年老号)
EMAIL:[email protected]
友链交换
如果有兴趣和本博客交换友链的话,请按照下面的格式在评论区进行评论,我会尽快添加上你的链接。
网站名称:KingYiFan’S Blog
网站地址:http://blog.cnbuilder.cn
网站描述:年少是你未醒的梦话,风华是燃烬的彼岸花。
网站Logo/头像: [头像地址](https://blog.cnbuilder.cn/upload/2018/7/avatar20180720144536200.jpg)