为什么Bouncycastle的PEMReader无法读取这个M2Crypto生成的PEM?

0 投票
1 回答
1958 浏览
提问于 2025-04-16 15:30

我用下面的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()

然后我用下面的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)

所以很明显,Bouncycastle错误地识别了PEM中的数据,认为这不是一个密钥对——但这是为什么呢?

1 个回答

1

在用调试工具查看Bouncycastle的时候,我发现了“原因”,但这让我更加困惑;虽然所有的类型看起来都没问题,但类型转换还是失败了。

如果A继承了B,B又继承了C,为什么我可以转换成A,却在转换成C的时候遇到ClassCastException错误?

撰写回答