AES出现Input length must be multiple of 16 when decrypting with padded cipher
一、大概意思就是说密文长度不是16的倍数
解决办法:增加二进制与十六进制互转的相关方法
package com.juhe.oceanus.api.util;import org.apache.commons.codec.binary.Base64;import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;/* @author kiki* @date 2023/2/28* @description*/
public class AESUtils {public static final String sKey = "1234567890123456";/将二进制转换成16进制* @param buf* @return*/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进制转换为二进制* @param hexStr* @return*/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(i*2, i*2+1), 16);int low = Integer.parseInt(hexStr.substring(i*2+1, i*2+2), 16);result[i] = (byte) (high * 16 + low);}return result;}/* 加密* @param sSrc 需要加密的字符串* 此处使用AES-128-ECB加密模式,key需要为16位。* @return* @throws Exception*/public static String Encrypt(String sSrc) throws Exception {// 判断Key是否为16位if (sKey.length() != 16) {throw new Exception("Key长度不是16位");}byte[] raw = sKey.getBytes("utf-8");SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");//"算法/模式/补码方式"cipher.init(Cipher.ENCRYPT_MODE, skeySpec);byte[] encrypted = cipher.doFinal(sSrc.getBytes("utf-8"));return parseByte2HexStr(encrypted);//return new Base64().encodeToString(encrypted);//此处使用BASE64做转码功能,同时能起到2次加密的作用。}/* 解密* @param sSrc 需要解密的字符串* 此处使用AES-128-ECB加密模式,key需要为16位。* @return* @throws Exception*/public static String Decrypt(String sSrc){byte[] sSrcc = parseHexStr2Byte(sSrc);try {// 判断Key是否正确if (sKey == null) {throw new Exception("Key为空null");}// 判断Key是否为16位if (sKey.length() != 16) {throw new Exception("Key长度不是16位");}byte[] raw = sKey.getBytes("utf-8");SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");cipher.init(Cipher.DECRYPT_MODE, skeySpec);//byte[] encrypted1 = new Base64().decode(sSrcc);//先用base64解密try {byte[] original = cipher.doFinal(sSrcc);String originalString = new String(original,"utf-8");return originalString;} catch (Exception e) {System.out.println(e.toString());return null;}} catch (Exception ex) {System.out.println(ex.toString());return null;}}/* public static void main(String[] args) throws Exception {//此处使用AES-128-ECB加密模式,key需要为16位。String cKey = "1234567890123456";// 需要加密的字串String cSrc = "K3@aD#UFV22";System.out.println(cSrc);// 加密String enString = AESUtils.Encrypt(cSrc);System.out.println("加密后的字串是:" + enString);// 解密String DeString = AESUtils.Decrypt(enString);System.out.println("解密后的字串是:" + DeString);}*/}