我使用M2Crypto使用以下Python代码生成PEM格式的RSA密钥对:

bio = BIO.MemoryBuffer()
key_pair = RSA.gen_key(1024, 65537)
key_pair.save_key_bio(bio, cipher=None)
return bio.read()


下面的Java代码使用Bouncycastle尝试读取它:

String signPem = ...;
PEMReader pemReader = new PEMReader(new StringReader(signPem));
Object signingKey = pemReader.readObject();


signPem字符串与bio.read()返回的字符串相同。这两个程序之间没有任何我能看到的数据混杂在一起;是-----BEGIN RSA PRIVATE KEY-----\n

但是,readObject()调用将引发ClassCastException:

java.lang.ClassCastException: org.bouncycastle.asn1.DERSequence
    at org.bouncycastle.asn1.ASN1Object.fromByteArray(Unknown Source)
    at org.bouncycastle.openssl.PEMReader.readKeyPair(Unknown Source)
    at org.bouncycastle.openssl.PEMReader.readObject(Unknown Source)


因此,很明显BC由于某种原因误认为PEM中的数据不是密钥对-但是为什么呢?

最佳答案

在对Bouncycastle进行调试之后,我发现了“原因”,但这只会使我感到困惑。即使所有类型似乎都是正确的,强制转换也会失败。

If A extends B extends C, why can I cast to A but get a ClassCastException casting to C?

07-24 18:30