java中的错误填充exception(RSA解密)

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

实际上,我使用java创建了一个公钥和私钥。 然后我将公钥交换到.Net团队。 他们使用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。