充气城堡没有这样的提供者例外

时间:2012-03-12 02:17:21

标签: java android bouncycastle

我已将弹性城堡jar文件添加到android和java中的应用程序类路径中。 这是我在他们两个中使用的代码。但它似乎没有认识到提供者“BC”。

SecureRandom sr1=new SecureRandom().getInstance("SHA1PRNG", "BC");
      System.out.println(sr1.getProvider());
      sr1.setSeed(12);
      byte[] a=new byte[0];
      sr1.nextBytes(a);
      int ai=a[0];
      System.out.println(ai);


它在android和java中抛出以下异常:

java.security.NoSuchProviderException: no such provider: BC


如何纠正?
我没有在策略文件中添加提供程序。在这之后我得到以下例外。

java.security.NoSuchAlgorithmException: no such algorithm: SHA1PRNG for provider
 BC<br>

这是否意味着充气城堡不提供“SHA1PRNG”算法的实现?但是我导入充气城堡的全部原因是在android和java中都有一个共同的提供者,所以使用相同种子生成的随机数序列在android和java中是相同的。

2 个答案:

答案 0 :(得分:4)

您是否添加了以下行?

  

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

默认的Java Security不包含Bouncy Castle实现,因此您需要将Bouncy Castle Provider添加到内存中可用的提供程序列表中,然后才能使用它。

http://www.java2s.com/Code/Java/Security/SecureRandomSHA1PRNG.htm

答案 1 :(得分:-1)

显然它根本不提供SecureRandom实施。您可以像这样获得系统实现(来自Harmony)(无需创建实例来调用静态方法):

SecureRandom.getInstance("SHA1PRNG")

BouncyCastle有DigestRandomGenerator,它可能以类似的方式使用,但可能与Sun SHA1PRNG兼容,也可能不兼容(它似乎是专有的,并且确实定义得很好)

回复:使用SecureRandom生成OTP:带有固定种子的SecureRandom 正确的工具。要生成OTP,您应该使用与可预测元素(时间或计数器)相结合的密钥。标准方法是使用由例如HMAC指定的HMAC。誓言。有关详细信息,请阅读RFC 4226