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开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

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

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

总而言之,面试官问来问去,问的那些Redis知识点也就这么多吧,复习的不够到位,知识点掌握不够熟练,所以面试才会卡壳。将这些Redis面试知识解析以及我整理的一些学习笔记分享出来给大家参考学习

还有更多学习笔记面试资料也分享如下:

都是“Redis惹的祸”,害我差点挂在美团三面,真是“虚惊一场”

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!**

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

总而言之,面试官问来问去,问的那些Redis知识点也就这么多吧,复习的不够到位,知识点掌握不够熟练,所以面试才会卡壳。将这些Redis面试知识解析以及我整理的一些学习笔记分享出来给大家参考学习

还有更多学习笔记面试资料也分享如下:

[外链图片转存中…(img-UgBRQKDJ-1713131218649)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 9
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值