我使用以下Python代码,使用M2Crypto,以PEM格式生成RSA密钥对:
bio = BIO.MemoryBuffer()
key_pair = RSA.gen_key(1024, 65537)
key_pair.save_key_bio(bio, cipher=None)
return bio.read()
以下使用Bouncycastle的Java代码尝试阅读它:
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中的数据由于某种原因不是关键对 - 但为什么呢?
答案 0 :(得分:1)
将调试器带到Bouncycastle之后,我发现了“原因”,但它只会让我感到困惑;即使所有类型看起来都是正确的,演员也会失败。
If A extends B extends C, why can I cast to A but get a ClassCastException casting to C?