gpt4 book ai didi

c# - java 中的错误填充异常(RSA 解密)

转载 作者:行者123 更新时间:2023-12-01 06:19:48 25 4
gpt4 key购买 nike

在解密java中的RSA Base64编码字符串时遇到一些问题。RSA加密字符串是由c#.Net制作的。

实际上,我使用java创建了公钥和私钥。然后我将公钥交换给.Net Team。他们通过使用公钥和 RSACryptoServiceProvider 类来加密字符串。

.Net代码:

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(keySize);
rsa.FromXmlString(publicKey);
.......
.......
byte[] encryptedBytes = rsa.Encrypt(tempBytes, false);
Array.Reverse(encryptedBytes);
stringBuilder.Append(Convert.ToBase64String(encryptedBytes));

Java解密代码:

   public static void doDecrypt( BigInteger  modules, BigInteger  d , String encrypted )
{
try {
byte[] decodedBytes = Base64.decodeBase64( encrypted );
KeyFactory factory = KeyFactory.getInstance("RSA");
Cipher cipher = Cipher.getInstance("RSA");

RSAPrivateKeySpec privSpec = new RSAPrivateKeySpec(modules, d);
PrivateKey privKey = factory.generatePrivate(privSpec);

cipher.init(Cipher.DECRYPT_MODE, privKey);
byte[] decrypted = cipher.doFinal(decodedBytes) ;
System.out.println("decrypted: " + new String(decrypted));
}
catch (Exception e) {
e.printStackTrace();
}

}

解密字符串时,出现以下错误。

javax.crypto.BadPaddingException: Data must start with zero
at sun.security.rsa.RSAPadding.unpadV15(RSAPadding.java:308)
at sun.security.rsa.RSAPadding.unpad(RSAPadding.java:255)
at com.sun.crypto.provider.RSACipher.a(DashoA13*..)
at com.sun.crypto.provider.RSACipher.engineDoFinal(DashoA13*..)
at javax.crypto.Cipher.doFinal(DashoA13*..)

然后,我尝试了

 Cipher cipher = Cipher.getInstance("RSA/ECB/NoPadding");

但是,它给出了垃圾字符,我无法将其与我想要的纯文本联系起来。我想,我在某个地方缺少做某事。请指导我。

最佳答案

rsa.Encrypt(tempBytes, false)

导致 PKCS#1 v1.5 填充。所以你必须在java端使用相同的。尝试使用

Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");

我认为 Windows API 默认使用 ECB,但您可能也想尝试其他模式,例如 CBC 或 CFB。

关于c# - java 中的错误填充异常(RSA 解密),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12543933/

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