RSA OAEP, Golang Encrypt, Java Decrypt -BadPaddingException: 解密错误
RSA OAEP, Golang Encrypt, Java Decrypt -BadPaddingException: Decryption error
我正在尝试解密使用 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));
}
- 我确定我使用的是相同的密钥对,而不是不同的私钥
- 确保哈希算法在加密和解密时使用相同的算法"SHA256"
我可能遗漏了一些东西,如果有人需要更多详细信息,请告诉我。感谢帮助!谢谢
OAEP 使用两种哈希算法:一种在标签上(fka 参数),一种在 Mask 生成函数 (MGF1) 中;这些可以不同。参见 rfc8017.
中的 7.1.1 和 B.2.1
我不知道 Go 代码是否设置了一个(和哪个)或两者,但是 Java 对 getInstance
的作用因您使用的提供程序而异,而这反过来又至少部分取决于您使用的 Java 的实现方式。 Sun/Oracle 中默认配置的 SunJCE 提供程序和 OpenJDK 实现仅更改标签哈希,使 MGF1 保持在 SHA1; BouncyCastle 提供者改变了两者。我不知道 IBM 和 Android 在这里做什么。
一旦您确定(或猜测)Go 在做什么,您就可以通过添加到您的 .init
调用来匹配它 OAEPParameterSpec
和相关的 MGF1ParameterSpec
.
主要是欺骗OAEPwithMD5andMGF1Padding in node-rsa
和
(复制于 https://security.stackexchange.com/questions/97548/breaking-down-rsa-ecb-oaepwithsha-256andmgf1padding )
我正在尝试解密使用 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));
}
- 我确定我使用的是相同的密钥对,而不是不同的私钥
- 确保哈希算法在加密和解密时使用相同的算法"SHA256"
我可能遗漏了一些东西,如果有人需要更多详细信息,请告诉我。感谢帮助!谢谢
OAEP 使用两种哈希算法:一种在标签上(fka 参数),一种在 Mask 生成函数 (MGF1) 中;这些可以不同。参见 rfc8017.
中的 7.1.1 和 B.2.1我不知道 Go 代码是否设置了一个(和哪个)或两者,但是 Java 对 getInstance
的作用因您使用的提供程序而异,而这反过来又至少部分取决于您使用的 Java 的实现方式。 Sun/Oracle 中默认配置的 SunJCE 提供程序和 OpenJDK 实现仅更改标签哈希,使 MGF1 保持在 SHA1; BouncyCastle 提供者改变了两者。我不知道 IBM 和 Android 在这里做什么。
一旦您确定(或猜测)Go 在做什么,您就可以通过添加到您的 .init
调用来匹配它 OAEPParameterSpec
和相关的 MGF1ParameterSpec
.
主要是欺骗OAEPwithMD5andMGF1Padding in node-rsa
和
(复制于 https://security.stackexchange.com/questions/97548/breaking-down-rsa-ecb-oaepwithsha-256andmgf1padding )