在 FIPS-140 模式下为 public 密钥配置 Bouncy Castle 填充机制

Configure Bouncy Castle padding mechanism for public key in FIPS-140 mode

根据Bouncy Castle FIPS Java API guide,版本:0.1

在第 4.2 节中,指定了一些填充机制与 Public 密钥算法(ELGAMAL/RSA)一起使用:

如何配置 public 密钥算法使用哪种填充机制?用于客户端和服务器通信。

我特别感兴趣的是 RSA 在 TLS 中用作密钥交换机制的情况。

当 RSA 用于 TLS plain-RSA 密钥交换中的密钥传输时,它始终使用 PKCS1-v1_5 填充;请参阅 rfc5246 4.7 and 7.4.7.1 或相应的早期版本(当时它被简称为块类型 2,因为 OAEP 还不存在)。您无法配置任何其他内容,其他任何内容都无法互操作。 (在 TLS1.3 中,目前提议的 RSA 密钥传输将不再存在。)

当 RSA 用于 TLS 中的服务器或客户端身份验证时,作为 DHE_RSA 和 ECDHE_RSA 等密钥交换的一部分,在 1.0 和 1.1 中,签名算法被固定为 PKCS1-v1_5(使用串联的 MD5 和 SHA1 哈希值,不使用 ASN.1 DigestInfo);参见 rfc4346 4.7 或 rfc2246。在 1.2 中,签名算法是从对等方提供的算法中选择的(在服务器的 ClientHello 扩展中,在客户端的 CertReq 字段中)但唯一的 RSA 选项是标准的 PKCS1-v1_5 with MD5 SHA-1 or SHA -2 哈希和许多(如果不是全部的话)实现(包括 Java 的最近更新)现在禁止 MD5; AFAICT 在 JSSE 中没有配置来选择允许的哈希值。 (1.3建议在协议中改为PSS,PKCS1-v1_5只允许对证书签名。)

如果您担心美国政府应用程序的 FIPS-140 合规性,请参阅 SP800-135,它批准了 TLS KDF 仅在 TLS 中使用,尽管它们通常不被批准用于FIPS-140。另请注意,除了加密原语之外,SP800-52 中还针对 TLS 的其他部分提供了广泛的强制性指导。