Das jar (bcprov-jdk16-145.jar) wurde dem Projekt Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider())
hinzugefügt, wurde der Klasse hinzugefügt und BouncyCastleProvider.PROVIDER_NAME
gibt "BC" zurück, aber AesFileIo.writeFile () löst immer noch aus java.security.NoSuchProviderException No such provider: BC
. Irgendwelche Ideen?
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);
}
}
}
java
security
cryptography
jce
Jacknad
quelle
quelle
Antworten:
Ich bin nicht sehr vertraut mit dem Android SDK, aber es scheint, dass der
android-sdk
mit demBouncyCastle
Anbieter bereits zur Sicherheit hinzugefügt kommt .In der PC-Umgebung müssen Sie es nur manuell hinzufügen.
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
Wenn Sie Zugriff auf die
policy
Datei haben, fügen Sie einfach einen Eintrag wie folgt hinzu:security.provider.5=org.bouncycastle.jce.provider.BouncyCastleProvider
Beachten
.5
Sie, dass dies einer fortlaufenden Anzahl der bereits hinzugefügten Anbieter entspricht.quelle
Security.addProvider
in Ihrem Code codieren, nur um sicherzustellen, dass es geladen ist, und vielleicht müssen Sie Ihrjar
zu Ihrem Projekt hinzufügen :)private static final String PROVIDER = BouncyCastleProvider.PROVIDER_NAME
als Feld im Code ein Feld hinzugefügt (das in "BC" aufgelöst wird), und ich habe das JAR zum Projekt hinzugefügt, aber weiterhin erhaltenjava.security.NoSuchProviderException: No such provider: BC
. Ich werde meine ursprüngliche Frage bearbeiten, indem ich die gesamte Klasse einbeziehe.Cipher cipher = Cipher.getInstance(AES_ALGORITHM);
eher alsCipher cipher = Cipher.getInstance(AES_ALGORITHM, PROVIDER);
. Ich nehme an, dieSecurity.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
Kräfte das "BC" und dasCipher.getInstance(AES_ALGORITHM, PROVIDER);
wird in diesem Zusammenhang einfach nicht verstanden.Sie können einen Sicherheitsanbieter hinzufügen, indem Sie java.security bearbeiten, indem Sie security.provider. = org.bouncycastle.jce.provider.BouncyCastleProvider hinzufügen
oder fügen Sie eine Zeile in Ihrer Klasse hinzu
Security.addProvider(new BouncyCastleProvider());
Sie können die folgende Zeile verwenden, um den Anbieter anzugeben, während Sie Algorithmen angeben
Cipher cipher = Cipher.getInstance("AES", "SunJCE");
Wenn Sie einen anderen Anbieter wie Bouncy Castle verwenden, dann
Cipher cipher = Cipher.getInstance("AES", "BC");
quelle
Sie können einen Sicherheitsanbieter hinzufügen, indem Sie java.security mit folgendem Code zum Erstellen eines statischen Blocks bearbeiten:
static { Security.addProvider(new BouncyCastleProvider()); }
Wenn Sie ein Maven-Projekt verwenden , müssen Sie die Abhängigkeit für BouncyCastleProvider wie folgt in der Datei pom.xml Ihres Projekts hinzufügen .
<dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15on</artifactId> <version>1.47</version> </dependency>
Wenn Sie ein normales Java-Projekt verwenden , können Sie den Download bcprov-jdk15on-147.jar über den unten angegebenen Link hinzufügen und Ihren Klassenpfad bearbeiten.
http://www.java2s.com/Code/Jar/b/Downloadbcprovextjdk15on147jar.htm
quelle
Für diejenigen, die Webserver verwenden, stellen Sie sicher, dass die bcprov-jdk16-145.jar in Ihrer Server-Bibliothek installiert wurde, da Weblogic das JAR einfügen musste:
quelle
Meine Erfahrung damit war, dass es in Ordnung war, den Provider als Zeichenfolge wie diese zu verwenden, wenn ich dies bei jeder Ausführung hatte
Security.addProvider(new BounctCastleProvider()); new JcaPEMKeyConverter().setProvider("BC");
Aber als ich optimiert und folgendes in den Konstruktor eingefügt habe:
if(bounctCastleProvider == null) { bounctCastleProvider = new BouncyCastleProvider(); } if(Security.getProvider(bouncyCastleProvider.getName()) == null) { Security.addProvider(bouncyCastleProvider); }
Dann musste ich einen solchen Anbieter verwenden, sonst würde ich den obigen Fehler bekommen:
new JcaPEMKeyConverter().setProvider(bouncyCastleProvider);
Ich verwende bcpkix-jdk15on Version 1.65
quelle