BouncyCastle.Cryptography(取代 Portable.BouncyCastle 的包)是纯托管代码:结果不取决于 Windows CNG 或 Linux 上的 OpenSSL 版本,这正是它与 System.Security.Cryptography 搭配使用的价值所在。它提供基于字符串的 SignerUtilities API,以及 ECDsaSigner 等更底层的类。
它的 ECDSA 默认行为遵循 OpenSSL 的传统,而不是 .NET 的:SHA-256withECDSA 生成 DER,而 SHA-256withPLAIN-ECDSA 给出 .NET 自带的 ECDsa 和 JWS 所用的 64 字节原始 r‖s。在同一个应用中同时使用这两个库时,把这两种格式弄混是最常见的互操作故障;所有格式错误的输入都返回 false,而不会抛出异常。通过 SignerUtilities 签名时 nonce 是随机的;ECDsaSigner 搭配 HMacDsaKCalculator 复现了 RFC 6979 的测试向量。s 不做规范化,验证时接受 high-S。
人们引入它,看重的正是算法覆盖面:P-224 到 P-521、secp256k1 和 Brainpool r1 曲线;Ed25519 和 Ed448(如示例所示);以及通过 MLKemEncapsulator、MLDsaSigner 和 SlhDsaSigner 提供的 ML-KEM、ML-DSA 和 SLH-DSA——基类库在同一个 Linux 镜像上报告完全不支持后量子算法,而这些在该镜像上都能正常工作。可以在后量子签名工具中试用这些算法。
PemWriter 把 EC 私钥写成 SEC1 格式的 -----BEGIN EC PRIVATE KEY-----,PemReader 则把它读回为 AsymmetricCipherKeyPair;PKCS#8 需通过 PrivateKeyInfoFactory 处理。所有 2.x 版本的程序集自身版本号都是强名称 2.0.0,因此比较行为时要查看包版本(这里是 2.7.0)。