为什么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 No such provider: 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); } } } 

我不是很熟悉android sdk,但它看到android-sdk自带的BouncyCastle提供程序已经添加到安全性。

你将不得不在PC环境中做的只是手动添加,

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

如果您有权访问policy文件,只需添加如下条目:

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

请注意.5它等于已经添加的提供者的序号。

您可以通过添加security.provider来编辑java.security来添加安全提供程序。= org.bouncycastle.jce.provider.BouncyCastleProvider

或者在class级顶部添加一行

 Security.addProvider(new BouncyCastleProvider()); 

您可以在指定algorithm时使用以下行来指定提供者

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

如果你正在使用像Bouncy Castle那样的其他供应商的话

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

您可以通过使用以下代码编辑java.security来添加安全提供程序,并创build静态块:

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

如果您使用的是Maven项目 ,那么您将不得不在项目的pom.xml文件中添加对BouncyCastleProvider的依赖关系。

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

如果你正在使用正常的java项目 ,那么你可以从下面给出的链接添加下载bcprov-jdk15on-147.jar并编辑你的类path。

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

对于那些正在使用networking服务器的人来说,确保bcprov-jdk16-145.jar已经安装在你的服务器库中,因为weblogic必须把jar放到:

 <weblogic_jdk_home>\jre\lib\ext