java - 解密失败 使用填充密码解密时,输入长度必须是 16 的倍数
问题描述
尝试解密我的加密消息时,使用填充密码解密时出现错误输入长度必须是 16 的倍数。
我加密的是这样的:
{
"guid": "d123-231s-2314w123-21312-2312312",
"userid": "000123",
"channel": "TESTINGCHANNELTEST"
}
但是当我解密它时,我得到了那个错误。但是当我解密这条消息时
{
"guid": "00",
"userid": "00",
"channel": "TEST"
}
有用。
是什么造成了这个问题?这是我的加密和解密代码:
public class EncryptDecryptModel {
private static final String key = "aesEncryptionKey";
private static final String initVector = "encryptionIntVec";
public static String encrypt(String value) {
try {
IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"));
SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
byte[] encrypted = cipher.doFinal(value.getBytes());
return Base64.encodeBase64String(encrypted);
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
public static String decrypt(String encrypted) {
try {
IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"));
SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
byte[] original = cipher.doFinal(Base64.decodeBase64(encrypted));
//original = Base64.decodeBase64(encrypted);
return new String(original);
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
这是为了加密:
@PostMapping("/getEncrypt")
public String getEncrypt(@RequestBody OpenMediaModel openMediaModel) throws UnsupportedEncodingException, InvalidAlgorithmParameterException, InvalidKeyException, NoSuchPaddingException, NoSuchAlgorithmException, BadPaddingException, IllegalBlockSizeException {
EncryptDecryptModel encryptDecryptModel=new EncryptDecryptModel();
MessageDigest digest = MessageDigest.getInstance("SHA-256");
String message = openMediaModel.getGuid() + "|" + openMediaModel.getCif()
+ "|" + openMediaModel.getChannel();
byte[] encodedhash = digest.digest(
message.getBytes(StandardCharsets.UTF_8));
message = message + "|" + new String(encodedhash);
return encryptDecryptModel.encrypt(message);
}
这就是我解密消息的方式:
@GetMapping("/getDecrypt")
public String getDecrypt(@RequestParam String encrypt) throws NoSuchPaddingException, UnsupportedEncodingException, NoSuchAlgorithmException, IllegalBlockSizeException, BadPaddingException, InvalidAlgorithmParameterException, InvalidKeyException {
EncryptDecryptModel encryptDecryptModel=new EncryptDecryptModel();
String plainMessage = encryptDecryptModel.decrypt(encrypt);
String[] splitMessage = plainMessage.split("\\|");
MessageDigest digest = MessageDigest.getInstance("SHA-256");
String message = splitMessage[0] + "|" + splitMessage[1]
+ "|" + splitMessage[2];
//byte[] encodedhash = digest.digest(
// message.getBytes(StandardCharsets.UTF_8));
//return new String(encodedhash).equals(splitMessage[3]);
return splitMessage[0]+"-"+splitMessage[1]+"-"+splitMessage[2];
}
问题是当我像第一个那样放置长 json 格式时,出现异常:
javax.crypto.IllegalBlockSizeException:使用填充密码解密时,输入长度必须是 16 的倍数
对不起,这是我第一次做这个加密。所以当我解密长消息时不知道。因为当我发短信时它工作得很好。我尝试使用 decodeBase64 但没有价值需要帮助。
提前致谢。
解决方案
推荐阅读
- ios - 是否支持使用 .p8 密钥进行 Ad Hoc 部署的 Apple 推送通知
- java - 用简单的英语,我如何使用图书馆?
- c# - 如何在 Lambda C# 项目中初始化 AWS XRay
- linux - 如何在 CentOS 8 中允许一个用户访问 atd 服务并拒绝另一个用户?
- swift - 如何在代码中找到 UIView 的创建位置 - swift - 以编程方式
- r - R随机分配到有条件的组
- python - 将数字转换为元组和内存错误
- python - 如何检索索引中的前两个值?
- perl - 如何忽略 perl 子例程上的 exit(1) - 尝试 eval 但没有用
- chef-infra - Chef Cookbook Recipe 操作以同意最终用户许可协议并自动执行安装过程