对称加密 CBC 模式 JAVA 工具类

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

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

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

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

img

最后

分享一些资料给大家,我觉得这些都是很有用的东西,大家也可以跟着来学习,查漏补缺。

《Java高级面试》

《Java高级架构知识》

《算法知识》

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!
lt=“img” style=“zoom: 33%;” />

最后

分享一些资料给大家,我觉得这些都是很有用的东西,大家也可以跟着来学习,查漏补缺。

《Java高级面试》

[外链图片转存中…(img-UX5Fw9Xx-1712431455387)]

《Java高级架构知识》

[外链图片转存中…(img-rfdNU3kv-1712431455387)]

《算法知识》

[外链图片转存中…(img-Da7i1Wne-1712431455387)]

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

  • 17
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值