Arjun
Arjun

Reputation: 3639

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.

Upvotes: 1

Views: 1907

Answers (4)

Phidius
Phidius

Reputation: 5237

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.

Upvotes: 0

Maarten Bodewes
Maarten Bodewes

Reputation: 93948

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.

Upvotes: 1

Arjun
Arjun

Reputation: 3639

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...

Upvotes: 0

divanov
divanov

Reputation: 6339

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);

Upvotes: 1

Related Questions