gpt4 book ai didi

java - 不同的加密 Android 与纯 Java - RSA/ECB/OAEPWithMD5AndMGF1Padding

转载 作者:行者123 更新时间:2023-12-04 23:55:16 24 4
gpt4 key购买 nike

我在 Android 中用公钥加密了一个字符串。但是,当我尝试使用纯 Java 代码中的私钥解密加密字符串时,出现“解密错误”异常。谁能帮忙找出问题所在?

要加密的安卓代码

import android.util.Base64;
public static String encryptMessage(final String plainText, final PublicKey publicKey) throws Exception {
Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithAndMGF1Padding");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
return Base64.encodeToString(cipher.doFinal(plainText.getBytes()), Base64.NO_WRAP);
}

用于解密的纯Java代码

import java.util.Base64;
public static String decryptMessage(final String encryptedText, final PrivateKey privateKey) throws Exception {
Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithAndMGF1Padding");
cipher.init(Cipher.DECRYPT_MODE, privateKey);

Base64.Decoder decoder = Base64.getDecoder();
byte[] byteArray = decoder.decode(encryptedText);
byte[] decryptedArray = cipher.doFinal(byteArray); // throw exception here
String plainText = new String(decryptedArray);
return plainText;
}

您可能会注意到我必须在 Android 和纯 Java 中使用不同的 Base64 API。我试过“RSA/ECB/PKCS1Padding”,无一异常(exception)都能正确解密。也尝试了“RSA/ECB/OAEPWithSHA-256AndMGF1Padding”,但出现了同样的异常。

最佳答案

OAEP 使用两个摘要,一个用于 OAEP 标签,另一个作为 MGF1 的基础,参见 RFC 8017,7.1. RSAES-OAEP , B.1. Hash FunctionsB.2. Mask Generation Functions .

此问题是由于在 OP 代码(Android/API 级别 28 和 Java 8)两边使用的提供程序对 OAEPWithMD5AndMGF1Padding 应用了不同的 MGF1 摘要。

双方的相关参数(提供商、OAEP 摘要、MGF、MGF1 摘要)可以在密码初始化后确定,例如与:

OAEPParameterSpec parameterSpec = cipher.getParameters().getParameterSpec(OAEPParameterSpec.class);
System.out.println("Provider: " + cipher.getProvider().getName());
System.out.println("OAEP digest: " + parameterSpec.getDigestAlgorithm());
System.out.println("OAEP MGF : " + parameterSpec.getMGFAlgorithm());
System.out.println("OAEP MGF1 digest: " + ((MGF1ParameterSpec)parameterSpec.getMGFParameters()).getDigestAlgorithm());

据此,MD5 在 Android 端被确定为 MGF1 摘要,在 Java 端被确定为 SHA-1。双方都使用 MD5 作为 OAEP 摘要。如果使用 OAEPParameterSpec 显式设置摘要,则可以解决此问题。以便双方使用相同的摘要。

例如,Java 端的以下代码确保将 MD5 用作 OAEP 和 MGF1 摘要,类似于 Android 端。

OAEPParameterSpec oaepParameterSpecDec = new OAEPParameterSpec("MD5", "MGF1", new MGF1ParameterSpec("MD5"), PSource.PSpecified.DEFAULT);
cipher.init(Cipher.DECRYPT_MODE, privateKey, oaepParameterSpecDec);

这同样适用于OAEPWithSHA-256AndMGF1Padding

另请注意 B.1. Hash Functions 中的 RFC 8017建议将 SHA-1 和 SHA-2 用于 RSAES-OAEP,但 MD5。

关于java - 不同的加密 Android 与纯 Java - RSA/ECB/OAEPWithMD5AndMGF1Padding,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62099069/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com