为什么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