RSA OAEP、Golang Encrypt、Java Decrypt-BadPaddingException:解密错误

RSA OAEP、Golang Encrypt、Java Decrypt-BadPaddingException:解密错误,java,go,rsa,public-key-encryption,badpaddingexception,Java,Go,Rsa,Public Key Encryption,Badpaddingexception,我正在尝试解密一个字符串,该字符串在Golang中使用RSA-OAEP加密。但是获取BadPaddingException:解密错误。很难弄清楚我错过了什么 这是Golang加密方法 func encryptString() { rootPEM := io_related.ReadFile("../../resources/pubkey.pem") //fmt.Printf("Cert String %q \n", rootPEM) block, _ := pem.Decode

我正在尝试解密一个字符串,该字符串在Golang中使用RSA-OAEP加密。但是获取BadPaddingException:解密错误。很难弄清楚我错过了什么

这是Golang加密方法

func encryptString() {
rootPEM := io_related.ReadFile("../../resources/pubkey.pem")
    //fmt.Printf("Cert String %q \n", rootPEM)

    block, _ := pem.Decode([]byte(rootPEM))
    var cert *x509.Certificate
    cert, _ = x509.ParseCertificate(block.Bytes)
    rsaPublicKey := cert.PublicKey.(*rsa.PublicKey)

    secretMessage := []byte("password")
    label := []byte("")

    // crypto/rand.Reader is a good source of entropy for randomizing the
    // encryption function.
    rng := rand.Reader

    ciphertext, err := rsa.EncryptOAEP(sha256.New(), rng, rsaPublicKey, secretMessage, label)
    if err != nil {
        fmt.Fprintf(os.Stderr, "Error from encryption: %s\n", err)
        return
    }

    // Since encryption is a randomized function, ciphertext will be
    // different each time.

    base64EncodedString := base64.StdEncoding.EncodeToString(ciphertext)
    fmt.Println(base64EncodedString)
}
我的java解密方法是

public void decryptString(String base64String) throws NoSuchAlgorithmException, CertificateException, IOException, KeyStoreException, UnrecoverableKeyException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException{
        FileInputStream is = new FileInputStream("priv.p12");
        KeyStore keystore = KeyStore.getInstance("PKCS12");
        keystore.load(is, "".toCharArray());
        System.out.println("Successfully loaded");


        String keyAlias = "1";


        PrivateKey key = (PrivateKey)keystore.getKey(keyAlias, "".toCharArray());

        System.out.println("key "+Base64.encodeBase64String(key.getEncoded()));
        Cipher rsaDecryptCipher;
        rsaDecryptCipher = Cipher.getInstance("RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING");
        rsaDecryptCipher.init(Cipher.DECRYPT_MODE, key);
        final byte[] plainText = rsaDecryptCipher.doFinal(Base64.decodeBase64(base64String));

        System.out.println("Plain   : " + new String(plainText));

    }
  • 我确保使用相同的密钥对,而不是不同的私钥
  • 确保加密和解密“SHA256”时使用相同的哈希算法

  • 我可能遗漏了什么,如果有人需要更多细节,请告诉我。谢谢你的帮助!!。感谢

    OAEP使用两种哈希算法:一种在标签上(fka参数),另一种在掩码生成函数(MGF1)内;这些可能是不同的。参见中的7.1.1和B.2.1

    我不知道Go代码是否设置了一个(和哪个)或两个,但Java如何处理
    getInstance
    取决于您使用的提供者,这反过来至少部分取决于您使用的Java实现。默认情况下,在Sun/Oracle和OpenJDK实现中配置的SunJCE提供程序只更改标签哈希,将MGF1保留为SHA1;BouncyCastle提供程序会同时更改这两个选项。我不知道IBM和Android在这里做什么

    一旦您确定(或猜测)Go正在做什么,您可以通过添加到
    .init
    调用适当的相关
    mgf1参数spec
    来匹配它

    大部分是被欺骗的


    (抄送至)

    谢谢您的解释。这有帮助。在检查Golang RSA源代码后,我发现Golang使用SHA-256实现这两个功能,我不得不在java中使用以下代码将MGF1修改为SHA-256。。
    Cipher-oaepFromInit=Cipher.getInstance(“RSA/ECB/OAEPPadding”);OAEPParameterSpec oaepParams=新的OAEPParameterSpec(“SHA-256”,“MGF1”,新的MGF1参数规范(“SHA-256”),PSSpecified.DEFAULT)
    您能否在go中共享最终加密,在Java(android)代码中共享解密?