> 文章列表 > AES出现Input length must be multiple of 16 when decrypting with padded cipher

AES出现Input length must be multiple of 16 when decrypting with padded cipher

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);}*/}