- @return
*/
public static String decrypt(String encrypted, String key, String initVector) {
try {
IvParameterSpec iv = new IvParameterSpec(initVector.getBytes(“UTF-8”));
SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes(“UTF-8”), “AES”);
Cipher cipher = Cipher.getInstance(“AES/CBC/NOPADDING”);
cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
byte[] original = cipher.doFinal(Base64.decodeBase64(encrypted));
return new String(original);
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
public static void main(String[] args) {
// 秘钥
String key = “0628154244CF368D”;
//偏移量
String initVector = “FA163E4A9E64F0E4”;
String originalStr = “d98a2345#selfservice-instance2#1”;
System.out.println("明文 - " + originalStr);
String encryptedString = encrypt(originalStr,key,initVector);
System.out.println("加密后 - " + encryptedString);
String decryptedString = decrypt(encryptedString,key,initVector);
System.out.println("解密后 - " + decryptedString);
}
}
工具类二(PKCS5Padding)
package com.eversec.ctf.util;
import java.io.UnsupportedEncodingException;
import java.nio.charset.StandardCharsets;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.Security;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
/**
-
@author XUWEICHAO
-
对称加密 CBC模式
*/
public class AESUtil {
/**
-
randomSourceLength:随机源长度.
-
@since JDK 1.8
*/
private static int RANDOM_SOURCE_LENGTH = 128;
public static final String CIPHER_MODE_CBC_PKCS5PADDING = “AES/CBC/PKCS5Padding”;
public static final String ENCRY_ALG = “AES”;
public static final String ENCODE_NAME_UTF8 = “utf-8”;
// =============================== 有向量 =====================
/**
-
createIV:创建指定长度向量.
-
@param ivSize 向量长度
-
@param password 密码
-
@return 向量
-
@author atc
-
@since JDK 1.8
*/
private static IvParameterSpec createIV(int ivSize, String password) {
StringBuffer sb = new StringBuffer(ivSize);
sb.append(password);
if (sb.length() > ivSize) {
sb.setLength(ivSize);
}
if (sb.length() < ivSize) {
while (sb.length() < ivSize) {
sb.append(“0”);
}
}
byte[] data = null;
try {
data = sb.toString().getBytes(ENCODE_NAME_UTF8);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return new IvParameterSpec(data);
}
/**
-
aesCbcPkcsNPaddingEncrypt:有向量CBC模式.
-
@param password 密码
-
@param content 待加密内容
-
@param ivSize 向量长度
-
@param ivStr 偏移量
-
@return
-
@author atc
-
@since JDK 1.8
*/
public static String aesCbcPkcsNPaddingEncrypt(String password, String content,
int ivSize, String ivStr) {
try {
byte[] byteEncode = content.getBytes(ENCODE_NAME_UTF8);
SecretKeySpec key = (SecretKeySpec) passwordKeyBytes(password);
Cipher cipher = Cipher.getInstance(CIPHER_MODE_CBC_PKCS5PADDING);
cipher.init(Cipher.ENCRYPT_MODE, key, createIV(ivSize, ivStr));
byte[] data = cipher.doFinal(byteEncode);
String result = Base64.encodeBase64String(data);
return result;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
-
aesCbcPkcsNPaddingDecrypt:AES数据解密,有向量CBC模式.
-
@param password 密码
-
@param content 加密后的内容
-
@param ivSize 向量长度
-
@param ivStr 偏移量
-
@return 解密后的内容
-
@author atc
-
@since JDK 1.8
*/
public static String aesCbcPkcsNPaddingDecrypt(String password, String content, int ivSize, String ivStr) {
try {
byte[] data = Base64.decodeBase64(content);
SecretKeySpec key = (SecretKeySpec) passwordKeyBytes(password);
Cipher cipher = Cipher.getInstance(CIPHER_MODE_CBC_PKCS5PADDING);
cipher.init(Cipher.DECRYPT_MODE, key, createIV(ivSize, ivStr));
byte[] bs = cipher.doFinal(data);
String result = new String(bs, ENCODE_NAME_UTF8);
return result;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
-
passwordKeyBytes:密钥KEY生成.
-
@param password 明文密码
-
@return 生成密码对应算法的密钥
-
@author atc
-
@since JDK 1.8
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

最后
分享一些资料给大家,我觉得这些都是很有用的东西,大家也可以跟着来学习,查漏补缺。
《Java高级面试》
《Java高级架构知识》
《算法知识》
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!
lt=“img” style=“zoom: 33%;” />
最后
分享一些资料给大家,我觉得这些都是很有用的东西,大家也可以跟着来学习,查漏补缺。
《Java高级面试》
[外链图片转存中…(img-UX5Fw9Xx-1712431455387)]
《Java高级架构知识》
[外链图片转存中…(img-rfdNU3kv-1712431455387)]
《算法知识》
[外链图片转存中…(img-Da7i1Wne-1712431455387)]
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!