远天战歌 2022-01-27 11:41 采纳率: 0%
浏览 803

RSA解密时报错javax.crypto.BadPaddingException: Decryption error

在使用2048位公钥私钥进行解密时出现javax.crypto.BadPaddingException: Decryption error,根据网上提供的信息是由于加密和解密填充的内容不一致导致的,但是目前没有解决办法,不知道问题出在哪?

//加密算法RSA
public static final String KEY_ALGORITHM = "RSA";

//RSA最大加密明文大小
private static final int MAX_ENCRYPT_BLOCK = 117;

//RSA最大解密密文大小
private static final int MAX_DECRYPT_BLOCK = 128;

public static String encryptByPublicKey(String dataBase64String, String publicKey) throws Exception {
//base64编码的公钥
byte[] decoded = Base64.decodeBase64(publicKey);
RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded));

byte[] data = dataBase64String.getBytes();
//        byte[] keyBytes = java.util.Base64.getDecoder().decode(publicKey);
//        X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
//        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
//        Key publicK = keyFactory.generatePublic(x509KeySpec);
        // 对数据加密
//        Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
Cipher cipher = Cipher.getInstance(KEY_ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, pubKey);
int inputLen = data.length;
ByteArrayOutputStream out = new ByteArrayOutputStream();
int offSet = 0;
byte[] cache;
int i = 0;
// 对数据分段加密
while (inputLen - offSet > 0) {
   if (inputLen - offSet > MAX_ENCRYPT_BLOCK) {
       cache = cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK);
   } else {
       cache = cipher.doFinal(data, offSet, inputLen - offSet);
   }
   out.write(cache, 0, cache.length);
   i++;
   offSet = i * MAX_ENCRYPT_BLOCK;
}
byte[] encryptedData = out.toByteArray();
out.close();
return java.util.Base64.getEncoder().encodeToString(encryptedData);
}


public static String decryptByPrivateKey(String encryptedDataString, String privateKey) throws Exception {
//64位解码加密后的字符串
byte[] encryptedData = Base64.decodeBase64(encryptedDataString.getBytes("UTF-8"));
//base64编码的私钥
byte[] decoded = Base64.decodeBase64(privateKey);
RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded));

//应该先使用Base64方式进行解码
//        byte[] encryptedData = encryptedDataString.getBytes();
//        byte[] keyBytes = java.util.Base64.getDecoder().decode(privateKey);
//        PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
//        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
//        Key privateK = keyFactory.generatePrivate(pkcs8KeySpec);
//        Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
        Cipher cipher = Cipher.getInstance(KEY_ALGORITHM);
        cipher.init(Cipher.DECRYPT_MODE, priKey);
        int inputLen = encryptedData.length;
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        int offSet = 0;
        byte[] cache;
        int i = 0;
        // 对数据分段解密
        while (inputLen - offSet > 0) {
            if (inputLen - offSet > MAX_DECRYPT_BLOCK) {
                cache = cipher.doFinal(encryptedData, offSet, MAX_DECRYPT_BLOCK);
            } else {
                cache = cipher.doFinal(encryptedData, offSet, inputLen - offSet);
            }
            out.write(cache, 0, cache.length);
            i++;
            offSet = i * MAX_DECRYPT_BLOCK;
        }
        byte[] decryptedData = out.toByteArray();
        out.close();
        return new String(decryptedData);
    }

public static void main(String[] args) {
try {

String data = "测试内容测试内容";
String encryptData = encryptByPublicKey(data, wfgy);
System.out.println("加密后内容:" + encryptData);
// RSA解密
String decryptData = decryptByPrivateKey(encryptData, wfsy);
            System.out.println("解密后内容:" + decryptData);
            // RSA签名
            String sign = sign(data, getPrivateKey(wfsy));
            // RSA验签
            boolean result = verify(data, getPublicKey(wfgy), sign);
            System.out.print("验签结果:" + result);
} catch (Exception e) {
            e.printStackTrace();
            System.out.print("加解密异常");
        }
    }
  • 写回答

1条回答 默认 最新

  • aabbabababaa 2022-01-27 14:47
    关注

    加密有问题还是解密?

    评论

报告相同问题?

问题事件

  • 创建了问题 1月27日

悬赏问题

  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料