Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why java.security.NoSuchProviderException No such provider: BC?

The jar (bcprov-jdk16-145.jar) has been added to the project, Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()) has been added to the class, and BouncyCastleProvider.PROVIDER_NAME does return "BC" but AesFileIo.writeFile() still throws java.security.NoSuchProviderException No such provider: BC. Any ideas?

import java.io.FileOutputStream; import java.io.InputStreamReader; import java.io.ObjectOutputStream; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import org.bouncycastle.jce.provider.BouncyCastleProvider;  public class AesFileIo {      private static final String AES_ALGORITHM = "AES/CTR/NoPadding";     private static final String PROVIDER = BouncyCastleProvider.PROVIDER_NAME;     private static final byte[] AES_KEY_128 = { // Hard coded for now         78, -90, 42, 70, -5, 20, -114, 103,         -99, -25, 76, 95, -85, 94, 57, 54};     private static final byte[] IV = { // Hard coded for now         -85, -67, -5, 88, 28, 49, 49, 85,         114, 83, -40, 119, -65, 91, 76, 108};     private static final SecretKeySpec secretKeySpec =             new SecretKeySpec(AES_KEY_128, "AES");     private static final IvParameterSpec ivSpec = new IvParameterSpec(IV);      public void AesFileIo() {         Security.addProvider(new org.bouncycastle.jce.provider                 .BouncyCastleProvider());     }      public void writeFile(String fileName, String theFile) {         try {             Cipher cipher = Cipher.getInstance(AES_ALGORITHM, PROVIDER);             cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivSpec);             byte[] encrypted = cipher.doFinal(theFile.getBytes());             ObjectOutputStream os = new ObjectOutputStream(                 new FileOutputStream(fileName));             os.write(encrypted);             os.flush();             os.close();         } catch (Exception e) {             StackTraceElement se = new Exception().getStackTrace()[0];             System.err.println(se.getFileName() + " " + se.getLineNumber()                     + " " + e);         }     } } 
like image 511
jacknad Avatar asked Sep 14 '10 18:09

jacknad


2 Answers

Im not very familiar with the Android sdk, but it seems that the android-sdk comes with the BouncyCastle provider already added to the security.

What you will have to do in the PC environment is just add it manually,

Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); 

if you have access to the policy file, just add an entry like:

security.provider.5=org.bouncycastle.jce.provider.BouncyCastleProvider  

Notice the .5 it is equal to a sequential number of the already added providers.

like image 55
Garis M Suero Avatar answered Sep 24 '22 08:09

Garis M Suero


You can add security provider by editing java.security with using following code with creating static block:

static {     Security.addProvider(new BouncyCastleProvider()); } 

If you are using maven project, then you will have to add dependency for BouncyCastleProvider as follows in pom.xml file of your project.

<dependency>             <groupId>org.bouncycastle</groupId>             <artifactId>bcprov-jdk15on</artifactId>             <version>1.47</version> </dependency> 

If you are using normal java project, then you can add download bcprov-jdk15on-147.jar from the link given below and edit your classpath.

http://www.java2s.com/Code/Jar/b/Downloadbcprovextjdk15on147jar.htm

like image 45
Krutik Avatar answered Sep 24 '22 08:09

Krutik