简体   繁体   中英

RSA decryption using Public Key - No such Provider

I have known public key and encrypted data. I want to decrypt it with public key. My code is look like:-

String s = "176byteofhexstring";
BigInteger Modulus = new BigInteger(s, 16);
String y = "03";
BigInteger Exponent = new BigInteger(y, 16);

RSAPublicKeySpec receiverPublicKeySpec = new RSAPublicKeySpec(Modulus, Exponent);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
RSAPublicKey receiverPublicKey = (RSAPublicKey)
    keyFactory.generatePublic(receiverPublicKeySpec);
Cipher rsaCipher = Cipher.getInstance("RSA/NONE/NoPadding","BC");
rsaCipher.init(Cipher.ENCRYPT_MODE, receiverPublicKey);
byte[] z = { 176 byte of cipher data };
byte[] m = rsaCipher.doFinal(z); 

When I am run this code, getting error like: java.security.NoSuchProviderException: No such provider: BC .

Could anybody tell me how to avoid this error.

Add somewhere in the beginning of your code:

Security.addProvider(new BouncyCastleProvider());

This will register BouncyCastle provider to the JCA.

Another option is to use provider directly:

private static final Provider BC_PROVIDER = new BouncyCastleProvider();

...

Cipher rsaCipher = Cipher.getInstance("RSA/NONE/NoPadding", BC_PROVIDER);

Here Want to share My doings for others.

Step1 - I was missing .Jar related to BouncyCastle (BC) , here the site help me to download the .jar file - http://www.itcsolutions.eu/2011/08/22/how-to-use-bouncy-castle-cryptographic-api-in-netbeans-or-eclipse-for-java-jse-projects/

step 2 - I download the jar from http://www.bouncycastle.org/latest_releases.html with name - bcprov-jdk15on-152.jar

step 3 - Add this jar to project, Properties -> Library -> Add Jar/folder

step 4 - add

import org.bouncycastle.jce.provider.BouncyCastleProvider;

step 5 - add line to your code

 Security.addProvider(new BouncyCastleProvider());

and it solve my purpose...

Just use Cipher rsaCipher = Cipher.getInstance("RSA/ECB/NoPadding"); . You don't need the Bouncy Castle provider to do textbook RSA. ECB here is a bit of a misnomer that is required for the provider of the standard JRE from Oracle; it's functionality the same as specifying NONE .


Note that using textbook RSA is completely insecure .


Completely missed it initially, but decryption with a public key is not the same thing as signature verification. Use the Signature class instead.

Cipher.getInstance also accepts just the transformation - the provider is optional. When you don't specify the provider, it will use the default provider as specified in your java.security file.

I came across this while experiencing the same problem (only with the Signature.getInstance), and the answers already provided were very helpful in helping me realize this.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM