来自大厂面试官的神秘礼物:算法解析大全(2)

// 真正开始解密操作
return new String(cipher.doFinal(Base64.decodeBase64(src)));
}

2.2 3DES

3DES(即Triple DES)是DESAES过渡的加密算法,它使用3条56位的密钥对数据进行三次加密。是DES的一个更安全的变形。它以DES为基本模块,通过组合分组方法设计出分组加密算法。比起最初的DES3DES更为安全。密钥长度默认为168位,还可以选择128位。

public static String encryptThreeDESECB(String src, String key) {
try{
DESedeKeySpec dks = new DESedeKeySpec(key.getBytes(“UTF-8”));
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(“DESede”);
SecretKey securekey = keyFactory.generateSecret(dks);

Cipher cipher = Cipher.getInstance(“DESede/ECB/PKCS5Padding”);
cipher.init(Cipher.ENCRYPT_MODE, securekey);
byte[] b = cipher.doFinal(src.getBytes(“UTF-8”));

String ss = new String(Base64.encodeBase64(b));
ss = ss.replaceAll(“\+”, “-”);
ss = ss.replaceAll(“/”, “_”);
return ss;
} catch(Exception ex){
ex.printStackTrace();
return src;
}
}

public static String decryptThreeDESECB(String src, String key) {
try{
src = src.replaceAll(“-”, “+”);
src = src.replaceAll(“_”, “/”);
byte[] bytesrc = Base64.decodeBase64(src.getBytes(“UTF-8”));
// --解密的key
DESedeKeySpec dks = new DESedeKeySpec(key.getBytes(“UTF-8”));
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(“DESede”);
SecretKey securekey = keyFactory.generateSecret(dks);

// --Chipher对象解密
Cipher cipher = Cipher.getInstance(“DESede/ECB/PKCS5Padding”);
cipher.init(Cipher.DECRYPT_MODE, securekey);
byte[] retByte = cipher.doFinal(bytesrc);

return new String(retByte, “UTF-8”);
} catch(Exception ex){
ex.printStackTrace();
return src;
}
}

2.3 AES

AES 高级数据加密标准,能够有效抵御已知的针对DES算法的所有攻击,默认密钥长度为128位,还可以供选择192位,256位。这里顺便提一句这个位指的是bit。

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 String encrypt(String data, String key) {
    return doAES(data, key, Cipher.ENCRYPT_MODE);
    }
    /
    *
  • 解密
    */
    public static String decrypt(String data, String key) {
    return doAES(data, key, Cipher.DECRYPT_MODE);
    }

/**

  • 加解密
    */
    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;
    }

推荐使用对称加密算法有:AES128AES192AES256

三、非对称加密算法

非对称加密算法有两个密钥,这两个密钥完全不同但又完全匹配。只有使用匹配的一对公钥和私钥,才能完成对明文的加密和解密过程。常见的非对称加密有RSASM2等。

3.1 RSA

RSA密钥至少为500位长,一般推荐使用1024位。

//非对称密钥算法
public static final String KEY_ALGORITHM = “RSA”;

/**

  • 密钥长度,DH算法的默认密钥长度是1024
  • 密钥长度必须是64的倍数,在512到65536位之间
    /
    private static final int KEY_SIZE = 1024;
    //公钥
    private static final String PUBLIC_KEY = “RSAPublicKey”;
    //私钥
    private static final String PRIVATE_KEY = “RSAPrivateKey”;
    /
    *
  • 初始化密钥对
  • @return Map 甲方密钥的Map
    /
    public static Map<String, Object> initKey() throws Exception {
    //实例化密钥生成器
    KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(KEY_ALGORITHM);
    //初始化密钥生成器
    keyPairGenerator.initialize(KEY_SIZE);
    //生成密钥对
    KeyPair keyPair = keyPairGenerator.generateKeyPair();
    //甲方公钥
    RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
    //甲方私钥
    RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
    //将密钥存储在map中
    Map<String, Object> keyMap = new HashMap<String, Object>();
    keyMap.put(PUBLIC_KEY, publicKey);
    keyMap.put(PRIVATE_KEY, privateKey);
    return keyMap;
    }
    /
    *
  • 私钥加密
  • @param data 待加密数据
  • @param key 密钥
  • @return byte[] 加密数据
    */
    public static byte[] encryptByPrivateKey(byte[] data, byte[] key) throws Exception {

//取得私钥
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(key);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
//生成私钥
PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
//数据加密
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.ENCRYPT_MODE, privateKey);
return cipher.doFinal(data);
}

/**

  • 公钥加密
  • @param data 待加密数据
  • @param key 密钥
  • @return byte[] 加密数据
    */
    public static byte[] encryptByPublicKey(byte[] data, byte[] key) throws Exception {

//实例化密钥工厂
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
//初始化公钥
//密钥材料转换
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(key);
//产生公钥
PublicKey pubKey = keyFactory.generatePublic(x509KeySpec);
//数据加密
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.ENCRYPT_MODE, pubKey);
return cipher.doFinal(data);
}

/**

  • 私钥解密
  • @param data 待解密数据
  • @param key 密钥
  • @return byte[] 解密数据
    */
    public static byte[] decryptByPrivateKey(byte[] data, byte[] key) throws Exception {
    //取得私钥
    PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(key);
    KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
    //生成私钥
    PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
    //数据解密
    Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
    cipher.init(Cipher.DECRYPT_MODE, privateKey);
    return cipher.doFinal(data);
    }

/**

  • 公钥解密
  • @param data 待解密数据
  • @param key 密钥
  • @return byte[] 解密数据
    */
    public static byte[] decryptByPublicKey(byte[] data, byte[] key) throws Exception {

//实例化密钥工厂
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
//初始化公钥
//密钥材料转换
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(key);
//产生公钥
PublicKey pubKey = keyFactory.generatePublic(x509KeySpec);
//数据解密
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.DECRYPT_MODE, pubKey);
return cipher.doFinal(data);
}

/**

  • 取得私钥
  • @param keyMap 密钥map
  • @return byte[] 私钥
    */
    public static byte[] getPrivateKey(Map<String, Object> keyMap) {
    Key key = (Key) keyMap.get(PRIVATE_KEY);
    return key.getEncoded();
    }

/**

  • 取得公钥
  • @param keyMap 密钥map
  • @return byte[] 公钥
    */
    public static byte[] getPublicKey(Map<String, Object> keyMap) throws Exception {
    Key key = (Key) keyMap.get(PUBLIC_KEY);
    return key.getEncoded();
    }

四、加密盐

加密盐也是比较常听到的一个概念,盐就是一个随机字符串用来和我们的加密串拼接后进行加密。加盐主要是为了提供加密字符串的安全性。假如有一个加盐后的加密串,黑客通过一定手段这个加密串,他拿到的明文,并不是我们加密前的字符串,而是加密前的字符串和盐组合的字符串,这样相对来说又增加了字符串的安全性。

文中的一些算法来源于网络,可直接复制使用

比较推荐的几个加密算法有:

  • 不可逆加密:SHA256SHA384SHA512以及HMAC-SHA256HMAC-SHA384HMAC-SHA512
  • 对称加密算法:AES3DES
  • 非对称加密算法:RSA
    ######经过日积月累, 以下是小编归纳整理的一些算法秘籍,希望可以帮助大家过关斩将顺利通过面试。
    ######由于整个文档比较全面,内容比较多,篇幅不允许,下面以截图方式展示 。如有需要获取资料文档的朋友 可以关注+转发后台私信我免费获取
  • 必读系列
  • 动态规划系列
  • 数据结构系列
  • 算法思维系列
  • 高频面试系列
  • 计算机系列




#####由于篇幅限制,文档的详解资料太全面,细节内容太多,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!如有需要获取资料文档的朋友 可以关注+转发后台私信我免费获取。

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

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

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

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

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

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

img

最后

针对以上面试题,小编已经把面试题+答案整理好了

最新大厂必问微服务面试题汇总:SpringCloud、Boot、Dubbo

最新大厂必问微服务面试题汇总:SpringCloud、Boot、Dubbo

最新大厂必问微服务面试题汇总:SpringCloud、Boot、Dubbo

面试专题

image

除了以上面试题+答案,小编同时还整理了微服务相关的实战文档也可以分享给大家学习

image

image

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

除了以上面试题+答案,小编同时还整理了微服务相关的实战文档也可以分享给大家学习

[外链图片转存中…(img-YQPfq5IG-1713735797484)]

[外链图片转存中…(img-lmai5XIR-1713735797484)]

[外链图片转存中…(img-PoTEF7Po-1713735797484)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值