java rsa 解密报:javax.crypto.BadPaddingException: Decryption error
at sun.security.rsa.RSAPadding.unpadV15(RSAPadding.java:380)
at sun.security.rsa.RSAPadding.unpad(RSAPadding.java:291)
at com.sun.crypto.provider.RSACipher.doFinal(RSACipher.java:356)
at com.sun.crypto.provider.RSACipher.engineDoFinal(RSACipher.java:389)
at javax.crypto.Cipher.doFinal(Cipher.java:2223)
at com.asymmetric.rsa.TestRSA.testDecrypt(TestRSA.java:115)
at com.asymmetric.rsa.TestRSA.main(TestRSA.java:34)
简单解释:
字面意思就是解密的时候填充错误,rsa 加解密都是把数据必须满足一定的长度,如果 不满足就要进行填充(一般是补0)直到满足特定的长度
测试代码
-
package com.asymmetric.rsa;
-
-
import java.io.ByteArrayOutputStream;
-
import java.io.IOException;
-
import java.security.InvalidKeyException;
-
import java.security.KeyFactory;
-
import java.security.NoSuchAlgorithmException;
-
import java.security.PrivateKey;
-
import java.security.PublicKey;
-
import java.security.spec.InvalidKeySpecException;
-
import java.security.spec.PKCS8EncodedKeySpec;
-
import java.security.spec.X509EncodedKeySpec;
-
import java.util.Base64;
-
-
import javax.crypto.BadPaddingException;
-
import javax.crypto.Cipher;
-
import javax.crypto.IllegalBlockSizeException;
-
import javax.crypto.NoSuchPaddingException;
-
-
-
-
public class TestRSA {
-
-
public static String publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDQgEoj3z9JrdPNI23DbMQkl3gkGuDke7iBr5yrYyqolkTyxuBLWFwHNuGv4VKOj9fXg61QxpaJ/fxDBvMvmkBSRowHBloGFceVTx8wV/8u0DcjvTCu0IZ1zp6wjG6xBn5j66Sg/q+9hvaY2p7fkKmsvcW6VoNPgQHU1Cf01DLZmQIDAQAB+oXcINOiE3AsuZ4VJmwNZg9Y/7fY+OFRS2JAh5YMsrv2qyoGP+Z9ksre26NYR+Lt91B2lhdwJHLpQpziaANZm/ONb31fj/lwIDAQAB";
-
public static String privateKey = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBANCASiPfP0mt080jbcNsxCSXeCQa4OR7uIGvnKtjKqiWRPLG4EtYXAc24a/hUo6P19eDrVDGlon9/EMG8y+aQFJGjAcGWgYVx5VPHzBX/y7QNyO9MK7QhnXOnrCMbrEGfmPrpKD+r72G9pjant+Qqay9xbpWg0+BAdTUJ/TUMtmZAgMBAAECgYBSozY/Z4FW+31h5fPgK+DFu/8TGFAgXuTvCaJnz2Md9IkZTDejxT6cYWUr53toI5zhvz/XLw6FXNQ54KxMJq/s9PiZYUgq/PMrnyU4gBSTm5BmiWjdaGicVEZ1lofHjpkAchPNW/CzwxD8AeKI7QaObE+EkWbLAi6sa+nRdHKgrQJBAOwYLD2DncU15XCKS0RNzTrNohdBQcisOPHdtQO0CGZlxx3xjuU4WL6/EpdmbjTeYbOSDKCmY5vyVbYZdOWfEs8CQQDiFIwWpvW2WLxLVw3i2P55WmMMXuecwEzg++ae3Ht7nW0zNcWSsyvHh40sM8XqEzmWOzMY6JOePbkuVfWTc4cXAkBRzf5mQhiEoKwjVofF3v9hhKbJT/8vPR1uENgLtHHEqTdZFL3ihqeZUDNs6jz9bKCFy/E8KOsSueEg+6kZdwjZAkEAj2RW4fstd2VasDJb5ViaNqAEmJENOBej60L6KCJR07qqy0M8t+oaR2iLOtDvo6Jj8QxFQXQqRMCDVodAxjANKwJAL3KuaqA6kdy9RxdV3uP8nRXLY7C/1ZIK6U0pyZqKXEwpD+7Ar3hwwhPz9TeuoqjB/cCknZjw70BQFQ0/VUHW2g==";
-
-
private static String algorithm = "RSA"; //$NON-NLS-1$
-
private static final int MAX_ENCRYPT_BLOCK = 117;
-
private static final int MAX_DECRYPT_BLOCK = 128;
-
private static String data = "test jiojiogeiojigouihgtest jiojiogeiojigouihgtest jiojiogeiojigouihgtest jiojiogeiojigouihgtest jiojiogeiojigouihgtest jiojiogeiojigouihgtest jiojiogeiojigouihgtest jiojiogeiojigouihgtest jiojiogeiojigouihgtest jiojiogeiojigouihgtest jiojiogeiojigouihgtest jiojiogeiojigouihgtest jiojiogeiojigouihgtest jiojiogeiojigouihgtest jiojiogeiojigouihgtest jiojiogeiojigouihgtest jiojiogeiojigouihg"; //$NON-NLS-1$
-
-
public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException, InvalidKeyException, IOException {
-
String test = testEncrypt(privateKey,data);
-
String testDecrypt = testDecrypt(publicKey, test);
-
System.out.println(testDecrypt);
-
-
}
-
-
-
/**
-
* 加密
-
* @param key
-
* @param data
-
* @return
-
* @throws NoSuchAlgorithmException
-
* @throws InvalidKeySpecException
-
* @throws NoSuchPaddingException
-
* @throws IllegalBlockSizeException
-
* @throws BadPaddingException
-
* @throws InvalidKeyException
-
* @throws IOException
-
*/
-
public static String testEncrypt(String key,String data) throws NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException, InvalidKeyException, IOException{
-
byte[] decode = Base64.getDecoder().decode(key);
-
PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(decode);
-
KeyFactory kf = KeyFactory.getInstance(algorithm);
-
PrivateKey generatePrivate = kf.generatePrivate(pkcs8EncodedKeySpec);
-
Cipher ci = Cipher.getInstance(algorithm);
-
ci.init(Cipher.ENCRYPT_MODE, generatePrivate);
-
-
byte[] bytes = data.getBytes();
-
int inputLen = bytes.length;
-
int offLen = 0;//偏移量
-
int i = 0;
-
ByteArrayOutputStream bops = new ByteArrayOutputStream();
-
while(inputLen - offLen > 0){
-
byte [] cache;
-
if(inputLen - offLen > 117){
-
cache = ci.doFinal(bytes, offLen,117);
-
}else{
-
cache = ci.doFinal(bytes, offLen,inputLen - offLen);
-
}
-
bops.write(cache);
-
i++;
-
offLen = 117 * i;
-
}
-
bops.close();
-
byte[] encryptedData = bops.toByteArray();
-
String encodeToString = Base64.getEncoder().encodeToString(encryptedData);
-
return encodeToString;
-
}
-
-
-
-
-
/**
-
* 解密
-
* @param key
-
* @param data
-
* @return
-
* @throws NoSuchAlgorithmException
-
* @throws InvalidKeyException
-
* @throws NoSuchPaddingException
-
* @throws InvalidKeySpecException
-
* @throws BadPaddingException
-
* @throws IllegalBlockSizeException
-
* @throws IOException
-
*/
-
public static String testDecrypt(String key,String data) throws NoSuchAlgorithmException, InvalidKeyException, NoSuchPaddingException, InvalidKeySpecException, IllegalBlockSizeException, BadPaddingException, IOException{
-
byte[] decode = Base64.getDecoder().decode(key);
-
// PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(decode); //java底层 RSA公钥只支持X509EncodedKeySpec这种格式
-
X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(decode);
-
KeyFactory kf = KeyFactory.getInstance(algorithm);
-
PublicKey generatePublic = kf.generatePublic(x509EncodedKeySpec);
-
Cipher ci = Cipher.getInstance(algorithm);
-
ci.init(Cipher.DECRYPT_MODE,generatePublic);
-
-
int inputLen = data.getBytes().length;
-
byte[] bytes = data.getBytes();
-
int offLen = 0;
-
int i = 0;
-
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
-
while(inputLen - offLen > 0){
-
byte[] cache;
-
if(inputLen - offLen > 128){
-
cache = ci.doFinal(bytes,offLen,128);
-
}else{
-
cache = ci.doFinal(bytes,offLen,inputLen - offLen);
-
}
-
byteArrayOutputStream.write(cache);
-
i++;
-
offLen = 128 * i;
-
-
}
-
byteArrayOutputStream.close();
-
byte[] byteArray = byteArrayOutputStream.toByteArray();
-
return new String(byteArray);
-
}
-
-
-
-
}
问题点:
后来发现确实是我自己的错误,rsa 加密后返回的字符串使用Base64编码的,忘了解密直接getBytes()就出错了
api 指出:BadPaddingException - 如果此 Cipher 为解密模式,并且未请求填充(或不填充),但解密的数据没有用适当的填充字节进行限制
只要是cipher.doFinal()解密时报 BadPaddingException 肯定是传入的字节数组有问题,传的不是加密时生成的数组
修正后的代码:
-
package com.asymmetric.rsa;
-
-
import java.io.ByteArrayOutputStream;
-
import java.io.IOException;
-
import java.security.InvalidKeyException;
-
import java.security.KeyFactory;
-
import java.security.NoSuchAlgorithmException;
-
import java.security.PrivateKey;
-
import java.security.PublicKey;
-
import java.security.spec.InvalidKeySpecException;
-
import java.security.spec.PKCS8EncodedKeySpec;
-
import java.security.spec.X509EncodedKeySpec;
-
import java.util.Base64;
-
-
import javax.crypto.BadPaddingException;
-
import javax.crypto.Cipher;
-
import javax.crypto.IllegalBlockSizeException;
-
import javax.crypto.NoSuchPaddingException;
-
-
-
-
public class TestRSA {
-
-
public static String publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDQgEoj3z9JrdPNI23DbMQkl3gkGuDke7iBr5yrYyqolkTyxuBLWFwHNuGv4VKOj9fXg61QxpaJ/fxDBvMvmkBSRowHBloGFceVTx8wV/8u0DcjvTCu0IZ1zp6wjG6xBn5j66Sg/q+9hvaY2p7fkKmsvcW6VoNPgQHU1Cf01DLZmQIDAQAB+oXcINOiE3AsuZ4VJmwNZg9Y/7fY+OFRS2JAh5YMsrv2qyoGP+Z9ksre26NYR+Lt91B2lhdwJHLpQpziaANZm/ONb31fj/lwIDAQAB";
-
public static String privateKey = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBANCASiPfP0mt080jbcNsxCSXeCQa4OR7uIGvnKtjKqiWRPLG4EtYXAc24a/hUo6P19eDrVDGlon9/EMG8y+aQFJGjAcGWgYVx5VPHzBX/y7QNyO9MK7QhnXOnrCMbrEGfmPrpKD+r72G9pjant+Qqay9xbpWg0+BAdTUJ/TUMtmZAgMBAAECgYBSozY/Z4FW+31h5fPgK+DFu/8TGFAgXuTvCaJnz2Md9IkZTDejxT6cYWUr53toI5zhvz/XLw6FXNQ54KxMJq/s9PiZYUgq/PMrnyU4gBSTm5BmiWjdaGicVEZ1lofHjpkAchPNW/CzwxD8AeKI7QaObE+EkWbLAi6sa+nRdHKgrQJBAOwYLD2DncU15XCKS0RNzTrNohdBQcisOPHdtQO0CGZlxx3xjuU4WL6/EpdmbjTeYbOSDKCmY5vyVbYZdOWfEs8CQQDiFIwWpvW2WLxLVw3i2P55WmMMXuecwEzg++ae3Ht7nW0zNcWSsyvHh40sM8XqEzmWOzMY6JOePbkuVfWTc4cXAkBRzf5mQhiEoKwjVofF3v9hhKbJT/8vPR1uENgLtHHEqTdZFL3ihqeZUDNs6jz9bKCFy/E8KOsSueEg+6kZdwjZAkEAj2RW4fstd2VasDJb5ViaNqAEmJENOBej60L6KCJR07qqy0M8t+oaR2iLOtDvo6Jj8QxFQXQqRMCDVodAxjANKwJAL3KuaqA6kdy9RxdV3uP8nRXLY7C/1ZIK6U0pyZqKXEwpD+7Ar3hwwhPz9TeuoqjB/cCknZjw70BQFQ0/VUHW2g==";
-
-
private static String algorithm = "RSA"; //$NON-NLS-1$
-
private static final int MAX_ENCRYPT_BLOCK = 117;
-
private static final int MAX_DECRYPT_BLOCK = 128;
-
private static String data = "test jiojiogeiojigouihgtest jiojiogeiojigouihgtest jiojiogeiojigouihgtest jiojiogeiojigouihgtest jiojiogeiojigouihgtest jiojiogeiojigouihgtest jiojiogeiojigouihgtest jiojiogeiojigouihgtest jiojiogeiojigouihgtest jiojiogeiojigouihgtest jiojiogeiojigouihgtest jiojiogeiojigouihgtest jiojiogeiojigouihgtest jiojiogeiojigouihgtest jiojiogeiojigouihgtest jiojiogeiojigouihgtest jiojiogeiojigouihg"; //$NON-NLS-1$
-
-
public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException, InvalidKeyException, IOException {
-
String test = testEncrypt(privateKey,data);
-
String testDecrypt = testDecrypt(publicKey, test);
-
System.out.println(testDecrypt);
-
-
}
-
-
-
/**
-
* 加密
-
* @param key
-
* @param data
-
* @return
-
* @throws NoSuchAlgorithmException
-
* @throws InvalidKeySpecException
-
* @throws NoSuchPaddingException
-
* @throws IllegalBlockSizeException
-
* @throws BadPaddingException
-
* @throws InvalidKeyException
-
* @throws IOException
-
*/
-
public static String testEncrypt(String key,String data) throws NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException, InvalidKeyException, IOException{
-
byte[] decode = Base64.getDecoder().decode(key);
-
PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(decode);
-
KeyFactory kf = KeyFactory.getInstance(algorithm);
-
PrivateKey generatePrivate = kf.generatePrivate(pkcs8EncodedKeySpec);
-
Cipher ci = Cipher.getInstance(algorithm);
-
ci.init(Cipher.ENCRYPT_MODE, generatePrivate);
-
-
byte[] bytes = data.getBytes();
-
int inputLen = bytes.length;
-
int offLen = 0;//偏移量
-
int i = 0;
-
ByteArrayOutputStream bops = new ByteArrayOutputStream();
-
while(inputLen - offLen > 0){
-
byte [] cache;
-
if(inputLen - offLen > 117){
-
cache = ci.doFinal(bytes, offLen,117);
-
}else{
-
cache = ci.doFinal(bytes, offLen,inputLen - offLen);
-
}
-
bops.write(cache);
-
i++;
-
offLen = 117 * i;
-
}
-
bops.close();
-
byte[] encryptedData = bops.toByteArray();
-
String encodeToString = Base64.getEncoder().encodeToString(encryptedData);
-
return encodeToString;
-
}
-
-
-
-
-
/**
-
* 解密
-
* @param key
-
* @param data
-
* @return
-
* @throws NoSuchAlgorithmException
-
* @throws InvalidKeyException
-
* @throws NoSuchPaddingException
-
* @throws InvalidKeySpecException
-
* @throws BadPaddingException
-
* @throws IllegalBlockSizeException
-
* @throws IOException
-
*/
-
public static String testDecrypt(String key,String data) throws NoSuchAlgorithmException, InvalidKeyException, NoSuchPaddingException, InvalidKeySpecException, IllegalBlockSizeException, BadPaddingException, IOException{
-
byte[] decode = Base64.getDecoder().decode(key);
-
// PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(decode); //java底层 RSA公钥只支持X509EncodedKeySpec这种格式
-
X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(decode);
-
KeyFactory kf = KeyFactory.getInstance(algorithm);
-
PublicKey generatePublic = kf.generatePublic(x509EncodedKeySpec);
-
Cipher ci = Cipher.getInstance(algorithm);
-
ci.init(Cipher.DECRYPT_MODE,generatePublic);
-
-
byte[] bytes = Base64.getDecoder().decode(data);
-
int inputLen = bytes.length;
-
int offLen = 0;
-
int i = 0;
-
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
-
while(inputLen - offLen > 0){
-
byte[] cache;
-
if(inputLen - offLen > 128){
-
cache = ci.doFinal(bytes,offLen,128);
-
}else{
-
cache = ci.doFinal(bytes,offLen,inputLen - offLen);
-
}
-
byteArrayOutputStream.write(cache);
-
i++;
-
offLen = 128 * i;
-
-
}
-
byteArrayOutputStream.close();
-
byte[] byteArray = byteArrayOutputStream.toByteArray();
-
return new String(byteArray);
-
}
-
-
-
-
}
java rsa 解密报:javax.crypto.BadPaddingException: Decryption error的更多相关文章
- RSA解密时javax.crypto.BadPaddingException: Data must start with zero
解决方法:要在加密后产生的byte数组转成string时要在各byte之间加个标识符,我加了个空格,然后再根据空格分隔转换回byte数组.如果不加标识符,由于byte值可能是一位到三位,无法知道某一个 ...
- 关于javax.crypto.BadPaddingException: Blocktype错误的几种解决方法
此文章转载自:http://www.myexception.cn/mobile/1259076.html 关于javax.crypto.BadPaddingException: Blocktype异常 ...
- exception javax.crypto.BadPaddingException: Given final block not properly padded
exception javax.crypto.BadPaddingException: Given final block not properly padded CreationTime--20 ...
- javax.crypto.BadPaddingException: Given final block not properly padded 解决方法
下面的 Des 加密解密代码,在加密时正常,但是在解密是抛出错误: javax.crypto.BadPaddingException: Given final block not properly p ...
- javax.crypto.BadPaddingException: Given final block not properly padded
一.报错 写了一个加密方法,在Windows上运行没有问题,在Linux上运行时提示如下错误: javax.crypto.BadPaddingException: Given final block ...
- android AES 部分机器javax.crypto.BadPaddingException: pad block corrupted
package com.bbguoxue.poetry.util; import java.security.SecureRandom; import javax.crypto.Cipher; imp ...
- 左右 android AES 所述机器的一部分 javax.crypto.BadPaddingException: pad block corrupted
好多人 android 使用上述 AES 显现 javax.crypto.BadPaddingException: pad block corrupted 下面的代码发布没问题,比较自己.不解释! p ...
- javax.crypto.BadPaddingException: Given final block not properly padded解决方案
解密的时候报错: javax.crypto.BadPaddingException: Given final block not properly padded 该异常是在解密 ...
- RSA解密报错java.security.spec.InvalidKeySpecException的解决办法
java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException : algid p ...
随机推荐
- Python中的文件和目录操作实现
Python中的文件和目录操作实现 对于文件和目录的处理,虽然可以通过操作系统命令来完成,但是Python语言为了便于开发人员以编程的方式处理相关工作,提供了许多处理文件和目录的内置函数.重要的是,这 ...
- PHP 二维数组按某一个键值排序
一.前言 在某个项目中,需要读取某个文件夹下的所有文件,在本地的 Windows 环境下时,读取出来的二维数组的文件名称和在 Windows 文件夹的文件排序一致, 但是项目上线后,环境为 Linux ...
- HDU 2222 AC自动机(模版题)
Keywords Search Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others ...
- 使用泛型类简化ibatis系统架构
jdk1.5的推出为我们带来了枚举.泛型.foreach循环.同步工具包等等好东西.其中,泛型的使用为我们的代码开发提供了很大的简便,简化了我们的代码. 1.设计思路 1)GenericDao泛型类提 ...
- Android AppUtil通用类
1.整体分析 1.1.先看一下源码,可以直接Copy. public class AppUtil { /** * 获取当前程序包名 * * @param context 上下文 * @return 程 ...
- 内部类inner class
1.什么是内部类,为什么要用内部类? 可以将一个类定义在另一个类的定义内部,这就是内部类. 当描述事物时,事物的内部还有事物,该事物用内部类来描述,因为内部事物在使用外部事物的内容. 如: class ...
- Django 2.0官方文档中文 总索引
Django 2.0官方文档中文 渣翻 总索引 翻译 2017年12月08日 11:19:1 官方原文: https://docs.djangoproject.com/en/2.0/ 当前翻译版本: ...
- erlang中的原子(atom)内部实现[转]
转自: http://www.kongqingquan.com/archives/208#more-208 Erlang中的atom由通用hash表实现,虚拟机中atom最终的用数值表示,对应表中的下 ...
- 剑指Offer - 九度1515 - 打印1到最大的N位数
剑指Offer - 九度1515 - 打印1到最大的N位数2013-11-30 01:11 题目描述: 给定一个数字N,打印从1到最大的N位数. 输入: 每个输入文件仅包含一组测试样例.对于每个测试案 ...
- python学习笔记五:模块和包
一.模块用import导入 cal.py: #!/usr/bin/python def add(x,y): return x+y if __name__ == '__main__': print ad ...