Java加密解密介绍

/*编码格式;默认使用uft-8/

public String charset = “utf-8”;

/*DES/

public int keysizeDES = 0;

/*AES/

public int keysizeAES = 128;

public static EncryptUtil me;

private EncryptUtil(){

//单例

}

//双重锁

public static EncryptUtil getInstance(){

if (me==null) {

synchronized (EncryptUtil.class) {

if(me == null){

me = new EncryptUtil();

}

}

}

return me;

}

/**

  • 使用MessageDigest进行单向加密(无密码)

  • @param res 被加密的文本

  • @param algorithm 加密算法名称

  • @return

*/

private String messageDigest(String res,String algorithm){

try {

MessageDigest md = MessageDigest.getInstance(algorithm);

byte[] resBytes = charset==null?res.getBytes():res.getBytes(charset);

return base64(md.digest(resBytes));

} catch (Exception e) {

e.printStackTrace();

}

return null;

}

/**

  • 使用KeyGenerator进行单向/双向加密(可设密码)

  • @param res 被加密的原文

  • @param algorithm 加密使用的算法名称

  • @param key 加密使用的秘钥

  • @return

*/

private String keyGeneratorMac(String res,String algorithm,String key){

try {

SecretKey sk = null;

if (key==null) {

KeyGenerator kg = KeyGenerator.getInstance(algorithm);

sk = kg.generateKey();

}else {

byte[] keyBytes = charset==null?key.getBytes():key.getBytes(charset);

sk = new SecretKeySpec(keyBytes, algorithm);

}

Mac mac = Mac.getInstance(algorithm);

mac.init(sk);

byte[] result = mac.doFinal(res.getBytes());

return base64(result);

} catch (Exception e) {

e.printStackTrace();

}

return null;

}

/**

  • 使用KeyGenerator双向加密,DES/AES,注意这里转化为字符串的时候是将2进制转为16进制格式的字符串,不是直接转,因为会出错

  • @param res 加密的原文

  • @param algorithm 加密使用的算法名称

  • @param key 加密的秘钥

  • @param keysize

  • @param isEncode

  • @return

*/

private String keyGeneratorES(String res,String algorithm,String key,int keysize,boolean isEncode){

try {

KeyGenerator kg = KeyGenerator.getInstance(algorithm);

if (keysize == 0) {

byte[] keyBytes = charset==null?key.getBytes():key.getBytes(charset);

kg.init(new SecureRandom(keyBytes));

}else if (key==null) {

kg.init(keysize);

}else {

byte[] keyBytes = charset==null?key.getBytes():key.getBytes(charset);

kg.init(keysize, new SecureRandom(keyBytes));

}

SecretKey sk = kg.generateKey();

SecretKeySpec sks = new SecretKeySpec(sk.getEncoded(), algorithm);

Cipher cipher = Cipher.getInstance(algorithm);

if (isEncode) {

cipher.init(Cipher.ENCRYPT_MODE, sks);

byte[] resBytes = charset==null?res.getBytes():res.getBytes(charset);

return parseByte2HexStr(cipher.doFinal(resBytes));

}else {

cipher.init(Cipher.DECRYPT_MODE, sks);

return new String(cipher.doFinal(parseHexStr2Byte(res)));

}

} catch (Exception e) {

e.printStackTrace();

}

return null;

}

private String base64(byte[] res){

return Base64.encode(res);

}

/**将二进制转换成16进制 */

public static String parseByte2HexStr(byte buf[]) {

StringBuffer sb = new StringBuffer();

for (int i = 0; i < buf.length; i++) {

String hex = Integer.toHexString(buf[i] & 0xFF);

if (hex.length() == 1) {

hex = ‘0’ + hex;

}

sb.append(hex.toUpperCase());

}

return sb.toString();

}

/*将16进制转换为二进制/

public static byte[] parseHexStr2Byte(String hexStr) {

if (hexStr.length() < 1)

return null;

byte[] result = new byte[hexStr.length()/2];

for (int i = 0;i< hexStr.length()/2; i++) {

int high = Integer.parseInt(hexStr.substring(i2, i2+1), 16);

int low = Integer.parseInt(hexStr.substring(i2+1, i2+2), 16);

result[i] = (byte) (high * 16 + low);

}

return result;

}

/**

  • md5加密算法进行加密(不可逆)

  • @param res 需要加密的原文

  • @return

*/

public String MD5(String res) {

return messageDigest(res, MD5);

}

/**

  • md5加密算法进行加密(不可逆)

  • @param res 需要加密的原文

  • @param key 秘钥

  • @return

*/

public String MD5(String res, String key) {

return keyGeneratorMac(res, HmacMD5, key);

}

/**

  • 使用SHA1加密算法进行加密(不可逆)

  • @param res 需要加密的原文

  • @return

*/

public String SHA1(String res) {

return messageDigest(res, SHA1);

}

/**

  • 使用SHA1加密算法进行加密(不可逆)

  • @param res 需要加密的原文

  • @param key 秘钥

  • @return

*/

public String SHA1(String res, String key) {

return keyGeneratorMac(res, HmacSHA1, key);

}

/**

  • 使用DES加密算法进行加密(可逆)

  • @param res 需要加密的原文

  • @param key 秘钥

  • @return

*/

public String DESencode(String res, String key) {

return keyGeneratorES(res, DES, key, keysizeDES, true);

}

/**

  • 对使用DES加密算法的密文进行解密(可逆)

  • @param res 需要解密的密文

  • @param key 秘钥

  • @return

*/

public String DESdecode(String res, String key) {

return keyGeneratorES(res, DES, key, keysizeDES, false);

}

/**

  • 使用AES加密算法经行加密(可逆)

  • @param res 需要加密的密文

  • @param key 秘钥

  • @return

*/

public String AESencode(String res, String key) {

return keyGeneratorES(res, AES, key, keysizeAES, true);

}

/**

  • 对使用AES加密算法的密文进行解密

  • @param res 需要解密的密文

  • @param key 秘钥

  • @return

*/

public String AESdecode(String res, String key) {

return keyGeneratorES(res, AES, key, keysizeAES, false);

}

/**

  • 使用异或进行加密

  • @param res 需要加密的密文

  • @param key 秘钥

  • @return

*/

public String XORencode(String res, String key) {

byte[] bs = res.getBytes();

for (int i = 0; i < bs.length; i++) {

bs[i] = (byte) ((bs[i]) ^ key.hashCode());

}

return parseByte2HexStr(bs);

}

/**

  • 使用异或进行解密

  • @param res 需要解密的密文

  • @param key 秘钥

  • @return

*/

public String XORdecode(String res, String key) {

byte[] bs = parseHexStr2Byte(res);

for (int i = 0; i < bs.length; i++) {

bs[i] = (byte) ((bs[i]) ^ key.hashCode());

}

return new String(bs);

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
无助。**

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-joF2v1qV-1715724681526)]

[外链图片转存中…(img-iNFlRxaH-1715724681527)]

[外链图片转存中…(img-JCm4aUIc-1715724681527)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值