Bouncy Castle 同时扮演两个角色:一是接入 Signature、KeyPairGenerator 和 KEM 的 JCA 提供程序(BC),二是 ECDSASigner 等无需 JCA 即可使用的轻量级 API。bcpkix 增加了证书、CMS、OCSP 支持,以及 JDK 至今仍缺少的 PEMParser。大多数涉及 secp256k1、Brainpool、PGP 或证书的 JVM 代码都依赖它。
它的 ECDSA 默认行为与 JDK 一致:SHA256withECDSA 使用随机 nonce 生成 DER 签名,不对 s 做规范化,验证时 high-S 和 low-S 都接受。差异体现在需要显式选用的算法名上。SHA256withPLAIN-ECDSA 生成 JWS 所要求的 64 字节原始 r‖s;SHA256withECDDSA 以确定性方式签名,轻量级的 ECDSASigner 搭配 HMacDSAKCalculator 则精确复现了 RFC 6979 的测试向量。与 SunEC 一样,把原始签名交给 DER 算法时会抛出 SignatureException,而不是返回 false。
大多数人选择它,是因为曲线覆盖面:P-224 到 P-521、secp256k1 和 Brainpool r1 曲线的签名与验证均成功,Ed25519 和 Ed448 也是如此。要注册提供程序并显式指定它——KeyPairGenerator.getInstance("EC", "BC")——否则会先查询 JDK 的 SunEC,而它会拒绝 secp256k1;示例正是这样避开了这个问题。
在已检查的库中,1.86 版的后量子覆盖面最广:BC 提供程序中有 ML-KEM(通过 javax.crypto.KEM 使用)、ML-DSA、SLH-DSA 和 LMS,BCPQC 中有 Falcon 和 XMSS。可以在后量子签名工具中试用这些算法,并用后量子证书查看器查看混合证书。
JcaPEMWriter 把 EC 私钥写成 SEC1 格式的 -----BEGIN EC PRIVATE KEY-----,PEMParser 会把它读回为 PEMKeyPair;要求 PKCS#8 的工具需要先转换密钥。PLAIN 签名和 DER 签名混淆时,DER ⇄ 原始格式转换器可以帮上忙。