大家好!当我尝试将java.security.PrivateKey对象转换为org.bouncycastle.asn1.pkcs.RSAPPrivateKey对象时,如代码所示。
void prvKey2BCRSAPrvKey() throws Exception {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(2048);
KeyPair keyPair = keyPairGenerator.genKeyPair();
PrivateKey privateKey = keyPair.getPrivate();
System.out.println(privateKey.getAlgorithm());
RSAPrivateKey rsaPrivateKey = RSAPrivateKey.getInstance(privateKey.getEncoded());
System.out.println(rsaPrivateKey.getVersion());
}
我总是犯错误。
java.lang.ClassCastException:org.bouncycastle.asn1.DLS序列无法转换为org.bouncycastle.ans1.ASN1Integer
网址:org.bouncycastle.asn1.pkcs.RSAPrivateKey.(未知来源(
网址:org.bouncycastle.asn1.pkcs.RSAPrivateKey.getInstance(未知来源(
我知道这里正在发生问题。
RSAPrivateKey.getInstance(privateKey.getEncoded())
更深层的原因在于这个函数,它位于org.bouncycastle.asn1.pkcs.RSAPrivateKey:中
private RSAPrivateKey(ASN1Sequence var1) {
Enumeration var2 = var1.getObjects();
ASN1Integer var3 = (ASN1Integer)var2.nextElement();
int var4 = var3.intValueExact();
if (var4 >= 0 && var4 <= 1) {
this.version = var3.getValue();
this.modulus = ((ASN1Integer)var2.nextElement()).getValue();
this.publicExponent = ((ASN1Integer)var2.nextElement()).getValue();
this.privateExponent = ((ASN1Integer)var2.nextElement()).getValue();
this.prime1 = ((ASN1Integer)var2.nextElement()).getValue();
this.prime2 = ((ASN1Integer)var2.nextElement()).getValue();
this.exponent1 = ((ASN1Integer)var2.nextElement()).getValue();
this.exponent2 = ((ASN1Integer)var2.nextElement()).getValue();
this.coefficient = ((ASN1Integer)var2.nextElement()).getValue();
if (var2.hasMoreElements()) {
this.otherPrimeInfos = (ASN1Sequence)var2.nextElement();
}
} else {
throw new IllegalArgumentException("wrong version for RSA private key");
}
}
当代码在这里运行时,就会出错。
ASN1Integer var3 = (ASN1Integer)var2.nextElement();
但我不知道该怎么修。是我写的一些代码错了吗?我使用java1.8,依赖BC的库是
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.70</version>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcpkix-jdk15on</artifactId>
<version>1.70</version>
</dependency>
有人能帮我吗?非常非常感谢!!!
JavaPrivateKey.getEncoded()
返回密钥的PKCS8编码这在超类java.security.Key
的javadoc中,无可否认,这不是最明显的地方。使用Bouncy,您可以使用org.bouncycastle.asn1.pkcs.PrivateKeyInfo
解码PKCS8并提取算法特定的部分,对于RSA来说,该部分是(PKCS1(RSAPrivateKey结构,并且该是您应该提供给org.bouncycastle.asn1.pkcs1.RSAPrivateKey.getInstance
的内容——您可以使用从parsePrivateKey
返回的任何ASN1Encodable
、其下的ASN1Sequence
或.getEncoded
返回的byte[]
。
比较如何在Java中将PKCS#8编码的RSA密钥转换为PKCS#1?以及Java中ECDSA的PEM编码(这是针对ECC而不是RSA的,但原理是相同的;公开:我的答案(。