使用 NodeJS 加密 <RSA_PKCS1_OAEP_PADDING> 填充和 <sha256> oaepHash 的 Java 解密

问题描述

我需要解密来自使用 NodeJS 构建的外部服务的一些信息。 此服务要求使用 base64 格式的 pem 格式的 RSA (2048) 公钥,以便对信息进行加密。

我正在用 Java 创建密钥对:

    KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
    kpg.initialize(2048);
    KeyPair kp = kpg.generateKeyPair();
    PublicKey pubkey = kp.getPublic();
    PrivateKey privkey = kp.getPrivate();

    String pemPublicString = "-----BEGIN PUBLIC KEY-----\n";
    pemPublicString = pemPublicString+Base64.getEncoder().encodeToString(pubkey.getEncoded())+"\n";
    pemPublicString = pemPublicString+"-----END PUBLIC KEY-----\n";
    
    String pemPrivateString = "-----BEGIN RSA PRIVATE KEY-----\n";
    pemPrivateString = pemPrivateString+Base64.getEncoder().encodeToString(privkey.getEncoded())+"\n";
    pemPrivateString = pemPrivateString+"-----END RSA PRIVATE KEY-----\n";
    
    //Send to node js service
    String base64publickey = Base64.getEncoder().encodeToString(pemPublicString.getBytes());

    //Store for decrypting
    String base64privatekey = Base64.getEncoder().encodeToString(pemPrivateString.getBytes());

外部服务按如下方式加密信息并返回字节:

  crypto.publicEncrypt(
  {
    key: publicKey,padding: crypto.constants.RSA_PKCS1_OAEP_PADDING,oaepHash: "sha256",},dataToEncrypt
  );

我正在尝试用 Java 解密信息,如下所示:

    public String decrypt(String payload,String privateKey){
      byte [] ciphertext = payload.getBytes(StandardCharsets.UTF_8);
      Cipher oaepFromInit = Cipher.getInstance("RSA/ECB/OAEPPadding");
      OAEPParameterSpec oaepParams = new OAEPParameterSpec("SHA-256","MGF1",new 
      MGF1ParameterSpec("SHA-1"),PSource.PSpecified.DEFAULT);
      oaepFromInit.init(Cipher.DECRYPT_MODE,getRSAPrivateKeyFrom(privateKey),oaepParams);
      byte[] pt = oaepFromInit.doFinal(ciphertext);
      return new String(pt,StandardCharsets.UTF_8);
    }

    private PrivateKey getRSAPrivateKeyFrom(String content) {
      byte[] decodedBytes = Base64.getDecoder().decode(content);
      String decodedString = new String(decodedBytes);
      Security.addProvider(new BouncyCastleProvider());
      PEMParser pemParser = new PEMParser(new StringReader(decodedString));
      JcaPEMKeyConverter converter = new JcaPEMKeyConverter().setProvider("BC");
      Object object = pemParser.readObject();
      PrivateKey k = converter.getPrivateKey((PrivateKeyInfo) object);
      return k;
   }

现在我收到了一个 BadPadding 异常,你知道可能是什么问题吗? 提前致谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)