为什么 java.security.NoSuchProviderException 没有这样的提供者:BC?
jar (bcprov-jdk16-145.jar) 已添加到项目中,Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider())
已添加到类中,并且BouncyCastleProvider.PROVIDER_NAME
确实返回“BC”,但 AesFileIo.writeFile() 仍然抛出 java.security.NoSuchProviderException 没有这样的提供程序: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);
}
}
}
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);
}
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
我对 Android sdk 不太熟悉,但似乎
android-sdk
附带的BouncyCastle
提供程序已添加到安全性中。在 PC 环境中您只需手动添加即可,
如果您有权访问
policy
文件,只需添加一个条目,例如:注意
.5
it等于已添加的提供者的序号。Im not very familiar with the Android sdk, but it seems that the
android-sdk
comes with theBouncyCastle
provider already added to the security.What you will have to do in the PC environment is just add it manually,
if you have access to the
policy
file, just add an entry like:Notice the
.5
it is equal to a sequential number of the already added providers.您可以通过使用以下代码编辑 java.security 来添加安全提供程序并创建静态块:
如果您使用的是 Maven 项目,那么您必须为 BouncyCastleProvider 添加依赖项:位于项目的 pom.xml 文件中。
如果您使用普通的java项目,那么您可以从下面给出的链接添加下载bcprov-jdk15on-147.jar并编辑您的类路径。
http://www.java2s.com/Code/Jar/b/Downloadbcprovextjdk15on147jar.htm
You can add security provider by editing java.security with using following code with creating static block:
If you are using maven project, then you will have to add dependency for BouncyCastleProvider as follows in pom.xml file of your project.
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
您可以通过编辑 java.security 添加安全提供程序
通过添加
security.provider.=org.bouncycastle.jce.provider.BouncyCastleProvider
或在类顶部添加一行,
则可以使用下面的行来指定提供程序,同时指定算法
如果您使用 Bouncy Castle 等其他提供程序,
you can add security provider by editing java.security
by adding
security.provider.=org.bouncycastle.jce.provider.BouncyCastleProvider
or add a line in your top of your class
you can use below line to specify provider while specifying algorithms
if you are using other provider like Bouncy Castle then
我对此的经验是,当我在每次执行中都有这个时,使用提供程序作为这样的字符串就可以了
但是当我优化并将以下内容放入构造函数中时:
然后我必须像这样使用提供程序,否则我会得到上面的结果错误:
我正在使用 bcpkix-jdk15on 版本 1.65
My experience with this was that when I had this in every execution it was fine using the provider as a string like this
But when I optimized and put the following in the constructor:
Then I had to use provider like this or I would get the above error:
I am using bcpkix-jdk15on version 1.65
对于那些使用 Web 服务器的用户,请确保 bcprov-jdk16-145.jar 已安装在您的服务器库中,因为 weblogic 必须将该 jar 放入:
For those who are using web servers make sure that the bcprov-jdk16-145.jar has been installed in you servers lib, for weblogic had to put the jar in: