2010-09-14 11 views
45

Il jar (bcprov-jdk16-145.jar) è stato aggiunto al progetto, Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()) è stato aggiunto alla classe e BouncyCastleProvider.PROVIDER_NAME restituisce "BC" ma AesFileIo.writeFile() continua a generare java.security.NoSuchProviderException No such provider: BC. Qualche idea?Perché java.security.NoSuchProviderException Nessun fornitore del genere: BC?

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); 
     } 
    } 
} 
+0

Si veda questo link, http://stackoverflow.com/questions/39097099/security-crypto-provider-deprecated-in-android-n/42337802#42337802 –

risposta

92

Im non molto familiare con la android sdk, ma seeems che il android-sdk viene fornito con il fornitore BouncyCastle già aggiunto alla sicurezza.

Cosa si dovrà fare in ambiente PC è sufficiente aggiungere manualmente,

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

se si ha accesso al file policy, basta aggiungere una voce del tipo:

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

prega si noti che .5 è uguale a un numero sequenziale dei provider già aggiunti.

+0

fa questo devono essere aggiunti manualmente per l'ambiente PC per tutti i PC che eseguono questa applicazione o può essere eseguita a livello di programmazione (bcprov-jdk16-145.jar è già stato aggiunto al progetto)? – jacknad

+2

Dovrai codificare il 'Sicurezza.addProvider' nel tuo codice, giusto per assicurarti che sia caricato, e forse dovrai aggiungere il tuo 'jar' al tuo progetto :) –

+0

Ho aggiunto' stringa finale statica privata PROVIDER = BouncyCastleProvider.PROVIDER_NAME' (che risolve in " BC ") come campo nel codice, e ho aggiunto il jar al progetto ma continuo a ottenere' java.security.NoSuchProviderException: No such provider: BC'. Modificherò la mia domanda originale includendo l'intera classe. – jacknad

9

è possibile aggiungere provider di sicurezza modificando java.security aggiungendo security.provider. = Org.bouncycastle.jce.provider.BouncyCastleProvider

o aggiungere una riga nel vostro superiore della vostra classe

Security.addProvider(new BouncyCastleProvider()); 

è possibile utilizzare sotto la linea per specificare fornitore specificando algoritmi

Cipher cipher = Cipher.getInstance("AES", "SunJCE"); 

se si utilizza altro provider come Bouncy Castle poi

Cipher cipher = Cipher.getInstance("AES", "BC"); 
1

Per coloro che utilizzano i server web assicurarsi che il bcprov-jdk16-145.jar è stato installato in voi server lib, per WebLogic ha dovuto mettere il vaso in:

<weblogic_jdk_home>\jre\lib\ext 
3

È possibile aggiungere provider di sicurezza modificando java.security con l'utilizzo di codice riportato di seguito con la creazione di blocco statico:

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

Se si utilizza progetto Maven, quindi dovrai aggiungere dipendenza per BouncyCastleProvider come segue nel file pom.xml del tuo progetto.

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

Se si utilizza il normale progetto Java, quindi è possibile aggiungere scaricare bcprov-jdk15on-147.jar dal link indicato di seguito e modificare il percorso di classe.

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

Problemi correlati