如何将java.security.PrivateKey对象转换为org.bouncycastle.asn1.pkcs.R



大家好!当我尝试将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的,但原理是相同的;公开:我的答案(。

相关内容

最新更新