我知道公钥和加密数据。我想用公钥解密它。我的代码如下: -
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
。
有人能告诉我如何避免这个错误。
答案 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),而且已经提供的答案对帮助我实现这一点非常有帮助。