使用公钥进行RSA解密 - 没有此类提供商

时间:2015-08-17 08:00:03

标签: java encryption rsa

我知道公钥和加密数据。我想用公钥解密它。我的代码如下: -

String s = "176byteofhexstring";
BigInteger Modulus = new BigInteger(s, 16);
String y = "03";
BigInteger Exponent = new BigInteger(y, 16);

RSAPublicKeySpec receiverPublicKeySpec = new RSAPublicKeySpec(Modulus, Exponent);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
RSAPublicKey receiverPublicKey = (RSAPublicKey)
    keyFactory.generatePublic(receiverPublicKeySpec);
Cipher rsaCipher = Cipher.getInstance("RSA/NONE/NoPadding","BC");
rsaCipher.init(Cipher.ENCRYPT_MODE, receiverPublicKey);
byte[] z = { 176 byte of cipher data };
byte[] m = rsaCipher.doFinal(z); 

当我运行此代码时,收到如下错误:java.security.NoSuchProviderException: No such provider: BC

有人能告诉我如何避免这个错误。

4 个答案:

答案 0 :(得分:1)

在代码的开头添加某个地方:

Security.addProvider(new BouncyCastleProvider());

这会将BouncyCastle提供者注册到JCA。

另一种选择是直接使用提供者:

private static final Provider BC_PROVIDER = new BouncyCastleProvider();

...

Cipher rsaCipher = Cipher.getInstance("RSA/NONE/NoPadding", BC_PROVIDER);

答案 1 :(得分:0)

此处想与他人分享我的行为。

Step1 - 我失踪.Jar与BouncyCastle(BC)有关,这里的网站帮助我下载.jar文件 - http://www.itcsolutions.eu/2011/08/22/how-to-use-bouncy-castle-cryptographic-api-in-netbeans-or-eclipse-for-java-jse-projects/

第2步 - 我从http://www.bouncycastle.org/latest_releases.html下载名称为bcprov-jdk15on-152.jar的jar

步骤3 - 将此jar添加到项目,属性 - >图书馆 - >添加Jar /文件夹

第4步 - 添加

import org.bouncycastle.jce.provider.BouncyCastleProvider;

第5步 - 在代码中添加行

 Security.addProvider(new BouncyCastleProvider());

它解决了我的目的......

答案 2 :(得分:0)

只需使用Cipher rsaCipher = Cipher.getInstance("RSA/ECB/NoPadding");即可。你不需要Bouncy Castle提供者来做教科书RSA。这里的ECB对于Oracle标准JRE的提供者来说有点用词不当;它的功能与指定NONE相同。

请注意,使用课本RSA为completely insecure

最初完全错过了,但使用公钥解密与签名验证不同。改为使用Signature类。

答案 3 :(得分:0)

Cipher.getInstance也只接受转换 - 提供者是可选的。如果您没有指定提供程序,它将使用java.security文件中指定的默认提供程序。

我在遇到同样的问题时遇到了这个问题(仅限Signature.getInstance),而且已经提供的答案对帮助我实现这一点非常有帮助。