2

我正在尝试解密使用 RSA-OAEP 在 Golang 中加密的字符串。但得到 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));

    }
  1. 我确保我使用的是相同的密钥对而不是不同的私钥
  2. 确保在加密和解密“SHA256”中使用相同的哈希算法

我可能遗漏了一些东西,如果有人需要更多详细信息,请告诉我。感谢帮助!谢谢

4

1 回答 1

1

OAEP 使用两种散列算法:一种在标签上(fka 参数),一种在掩码生成函数(MGF1)内;这些可以不同。请参阅rfc8017中的 7.1.1 和 B.2.1 。

我不知道 Go 代码是否设置了一个(和哪个)或两者,但 Java 对此做了什么getInstance取决于您使用的提供程序,而这又至少部分取决于您使用的 Java 实现。Sun/Oracle 和 OpenJDK 实现中默认配置的 SunJCE 提供程序仅更改标签哈希,将 MGF1 保持在 SHA1;BouncyCastle 提供者同时改变了两者。我不知道 IBM 和 Android 在这里做什么。

一旦您确定(或猜测)Go 正在做什么,您可以通过在您的.init调用中添加适当OAEPParameterSpec且相关的MGF1ParameterSpec.

主要是在 node-rsa 中欺骗OAEPwithMD5andMGF1Padding
分解 RSA/ECB/OAEPWithSHA-256AndMGF1Padding
(复制于https://security.stackexchange.com/questions/97548/break-down-rsa-ecb-oaepwithsha-256andmgf1padding

于 2018-04-05T23:46:55.210 回答