java加密解密工具类
package com.founder.mrp.util; import java.nio.charset.StandardCharsets;
import java.security.Key; import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec; import com.founder.mrp.web.jsonEntity.AccountJson; /**
* 加密解密类
* @author xiongzq
*
*/
public class EncryptionDecryption { private static String strDefaultKey = "UvVi-s`75X-d9fO3"; /** 加密工具 */
private ThreadLocal<Cipher> encryptCipher = new ThreadLocal<Cipher>() {
@Override
protected Cipher initialValue() {
try {
Cipher encryptCipher = Cipher.getInstance(algorithmName);
encryptCipher.init(Cipher.ENCRYPT_MODE, key);
return encryptCipher;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}; /** 解密工具 */
private ThreadLocal<Cipher> decryptCipher = new ThreadLocal<Cipher>() {
@Override
protected Cipher initialValue() {
try {
Cipher decryptCipher = Cipher.getInstance(algorithmName);
decryptCipher.init(Cipher.DECRYPT_MODE, key);
return decryptCipher;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}; private String algorithmName;
private Key key; /**
* 将byte数组转换为表示16进制值的字符串, 如:byte[]{8,18}转换为:0813, 和public static byte[]
* hexStr2ByteArr(String strIn) 互为可逆的转换过程
*
* @param arrB
* 需要转换的byte数组
* @return 转换后的字符串
* @throws Exception
*
*/
public static String byteArr2HexStr(byte[] arrB) throws Exception {
// 每个byte用两个字符才能表示,所以字符串的长度是数组长度的两倍
StringBuilder sb = new StringBuilder(arrB.length * 2);
for (int b : arrB) {
int intTmp = b;
// 把负数转换为正数
while (intTmp < 0) {
intTmp = intTmp + 256;
}
// 小于0F的数需要在前面补0
if (intTmp < 16) {
sb.append("0");
}
sb.append(Integer.toString(intTmp, 16));
}
return sb.toString();
} /**
* 将表示16进制值的字符串转换为byte数组, 和public static String byteArr2HexStr(byte[] arrB)
* 互为可逆的转换过程
*
* @param strIn 需要转换的字符串
* @return 转换后的byte数组
*
*/
public static byte[] hexStr2ByteArr(String strIn) {
byte[] arrB = strIn.getBytes();
int iLen = arrB.length; // 两个字符表示一个字节,所以字节数组长度是字符串长度除以2
byte[] arrOut = new byte[iLen / 2];
for (int i = 0; i < iLen; i = i + 2) {
String strTmp = new String(arrB, i, 2);
arrOut[i / 2] = (byte) Integer.parseInt(strTmp, 16);
}
return arrOut;
} /**
* 默认构造方法,使用默认密钥
*
* @throws Exception
*/
public EncryptionDecryption() throws Exception {
this("AES/ECB/PKCS5Padding", strDefaultKey, 128);
} /**
* 指定密钥构造方法
*
* @param strKey 指定的密钥
* @throws Exception
*/
public EncryptionDecryption(String algorithmName, String strKey, int keySizeInBits) throws Exception {
this.algorithmName = algorithmName;
this.key = getKey(strKey.getBytes(StandardCharsets.UTF_8), keySizeInBits);
} /**
* 加密字节数组
*
* @param arrB
* 需加密的字节数组
* @return 加密后的字节数组
* @throws Exception
*/
public byte[] encrypt(byte[] arrB) throws Exception {
return encryptCipher.get().doFinal(arrB);
} /**
* 加密字符串
*
* @param strIn
* 需加密的字符串
* @return 加密后的字符串
* @throws Exception
*/
public String encrypt(String strIn) throws Exception {
return byteArr2HexStr(encrypt(strIn.getBytes()));
} /**
* 解密字节数组
*
* @param arrB
* 需解密的字节数组
* @return 解密后的字节数组
* @throws Exception
*/
public byte[] decrypt(byte[] arrB) throws Exception {
return decryptCipher.get().doFinal(arrB);
} /**
* 解密字符串
*
* @param strIn
* 需解密的字符串
* @return 解密后的字符串
* @throws Exception
*/
public String decrypt(String strIn) throws Exception {
try {
return new String(decrypt(hexStr2ByteArr(strIn)));
} catch (Exception e) {
return "";
}
} /**
* 从指定字符串生成密钥,密钥所需的字节数组长度为8位 不足8位时后面补0,超出8位只取前8位
*
* @param arrBTmp
* 构成该字符串的字节数组
* @param keySizeInBits
* @return 生成的密钥
* @throws java.lang.Exception
*/
private Key getKey(byte[] arrBTmp, int keySizeInBits) throws Exception {
// 创建一个空的字节数组(默认值为0)
byte[] arrB = new byte[keySizeInBits / 8]; // 将原始字节数组转换为8位
for (int i = 0; i < arrBTmp.length && i < arrB.length; i++) {
arrB[i] = arrBTmp[i];
} // 生成密钥
String keyAlg = algorithmName;
int t = algorithmName.indexOf('/');
if (t != -1) {
keyAlg = algorithmName.substring(0, t);
} return new SecretKeySpec(arrB, keyAlg);
}
}
java加密解密工具类的更多相关文章
- java 加密解密工具类(实用!!!)
最近发现了一个加密解密的好例子,很方便使用,可以作为平时开发的工具集,记录一下. package com.sh.springboottdemo2.util; import com.sun.org.ap ...
- Base64加密解密工具类
使用Apache commons codec类Base64进行加密解密 maven依赖 <dependency> <groupId>commons-codec</grou ...
- .Net(c#)加密解密工具类:
/// <summary> /// .Net加密解密帮助类 /// </summary> public class NetCryptoHelper { #region des实 ...
- 加密解密工具类(Java,DES)
一个Java版的DES加密工具类,能够用来进行网络传输数据加密,保存password的时候进行加密. import java.security.Key; import java.security.sp ...
- AES加密解密工具类封装(AESUtil)
package club.codeapes.common.utils; import org.springframework.util.Base64Utils; import javax.crypto ...
- des 加密解密工具类
最近在做des的双对称加密解密,特此记录一下. des对称加密,是一种比较传统的加密方式,其加密运算.解密运算使用的是同样的密钥,信息的发送者和信息的接收者在进行信息的传输与处理时,必须共同持有该密码 ...
- java中加密解密工具类
在工作中经常遇到需要加密.解密的场景.例如用户的手机号等信息,在保存到数据库的过程中,需要对数据进行加密.取出时进行解密. public class DEStool { private String ...
- 自写AES加密解密工具类
此类主要用于加密与解密,采用128位ECB模式,PKCS5Padding填充补位. 可使用方法为加密返回二进制encryptBin(content, key).加密返回十六进制encryptHex(c ...
- Java-DES算法加密解密工具类
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import ...
随机推荐
- Go Programming Language 3
[Go Programming Language 3] 1.These two statements declare a struct type called and a variable calle ...
- Pytorch: parameters(),children(),modules(),named_*区别
nn.Module vs nn.functional 前者会保存权重等信息,后者只是做运算 parameters() 返回可训练参数 nn.ModuleList vs. nn.ParameterLis ...
- JS在HTML文档引入位置
我们今天来聊一聊关于JavaScript文件的引入位置的问题:大家在平时的Web开发中有没有想过这样一个问题,那就是我应该在文档的头部(也就是<head>标签内部里面)引入所需要的Java ...
- Latex使用过程中的一些总结
本文主要总结在使用Latex过程中遇到的一些问题及解决方案. 一:关于参考文献 1.如何在paper同一处用\cite命令同时引用多篇文献? 用\cite{bibtex1}\cite{bibtex2} ...
- eclipse IDE for java developers下载与安装
1.进入eclipse官网下载页面 https://www.eclipse.org/downloads/ 2.点击Download Packages 3.windows 用户 选择 64 bits 4 ...
- 【redis】设置密码
1.第一种方式 (当前这种linux配置redis密码的方法是一种临时的,如果redis重启之后密码就会失效,) (1)首先进入redis,如果没有开启redis则需要先开启:[root@iZ94jz ...
- 第05组 Beta冲刺(2/4)
第05组 Beta冲刺(2/4) 队名:天码行空 组长博客连接 作业博客连接 团队燃尽图(共享): GitHub当日代码/文档签入记录展示(共享): 组员情况: 组员1:卢欢(组长) 过去两天完成了哪 ...
- mybatis学习4
QL99中的连接查询 连接查询 交叉连接 select * from A,B; 内连接 隐式内连接 select * from A,B where 条件 显示内连接 select * fr ...
- Pandas | 16 聚合
当有了滚动,扩展和ewm对象创建了以后,就有几种方法可以对数据执行聚合. DataFrame应用聚合 可以通过向整个DataFrame传递一个函数来进行聚合,或者通过标准的获取项目方法来选择一个列. ...
- ABP abp zreo 老版本 支持dotnet framework 4.0
下载了个abp zreo的老版本,module-zero-template-1.5.1, 只有这个版本支持.net framework4.0,其它都依赖.net framework 4.5和4.6去了 ...