我应该使用哪个椭圆曲线?

信息安全 openssl 电子抄送
2021-08-15 01:52:43

我目前正在更新 SSL 证书,并且正在考虑切换到椭圆曲线。Per Bernstein 和 Lange,我知道不应该使用某些曲线,但我很难在 OpenSSL 中选择正确的曲线:

$ openssl ecparam -list_curves
  secp112r1 : SECG/WTLS curve over a 112 bit prime field
  secp112r2 : SECG curve over a 112 bit prime field
  secp128r1 : SECG curve over a 128 bit prime field
  secp128r2 : SECG curve over a 128 bit prime field
  secp160k1 : SECG curve over a 160 bit prime field
  secp160r1 : SECG curve over a 160 bit prime field
  secp160r2 : SECG/WTLS curve over a 160 bit prime field
  secp192k1 : SECG curve over a 192 bit prime field
  secp224k1 : SECG curve over a 224 bit prime field
  secp224r1 : NIST/SECG curve over a 224 bit prime field
  secp256k1 : SECG curve over a 256 bit prime field
  secp384r1 : NIST/SECG curve over a 384 bit prime field
  secp521r1 : NIST/SECG curve over a 521 bit prime field
  prime192v1: NIST/X9.62/SECG curve over a 192 bit prime field
  prime192v2: X9.62 curve over a 192 bit prime field
  prime192v3: X9.62 curve over a 192 bit prime field
  prime239v1: X9.62 curve over a 239 bit prime field
  prime239v2: X9.62 curve over a 239 bit prime field
  prime239v3: X9.62 curve over a 239 bit prime field
  prime256v1: X9.62/SECG curve over a 256 bit prime field
  sect113r1 : SECG curve over a 113 bit binary field
  sect113r2 : SECG curve over a 113 bit binary field
  sect131r1 : SECG/WTLS curve over a 131 bit binary field
  sect131r2 : SECG curve over a 131 bit binary field
  sect163k1 : NIST/SECG/WTLS curve over a 163 bit binary field
  sect163r1 : SECG curve over a 163 bit binary field
  sect163r2 : NIST/SECG curve over a 163 bit binary field
  sect193r1 : SECG curve over a 193 bit binary field
  sect193r2 : SECG curve over a 193 bit binary field
  sect233k1 : NIST/SECG/WTLS curve over a 233 bit binary field
  sect233r1 : NIST/SECG/WTLS curve over a 233 bit binary field
  sect239k1 : SECG curve over a 239 bit binary field
  sect283k1 : NIST/SECG curve over a 283 bit binary field
  sect283r1 : NIST/SECG curve over a 283 bit binary field
  sect409k1 : NIST/SECG curve over a 409 bit binary field
  sect409r1 : NIST/SECG curve over a 409 bit binary field
  sect571k1 : NIST/SECG curve over a 571 bit binary field
  sect571r1 : NIST/SECG curve over a 571 bit binary field
  c2pnb163v1: X9.62 curve over a 163 bit binary field
  c2pnb163v2: X9.62 curve over a 163 bit binary field
  c2pnb163v3: X9.62 curve over a 163 bit binary field
  c2pnb176v1: X9.62 curve over a 176 bit binary field
  c2tnb191v1: X9.62 curve over a 191 bit binary field
  c2tnb191v2: X9.62 curve over a 191 bit binary field
  c2tnb191v3: X9.62 curve over a 191 bit binary field
  c2pnb208w1: X9.62 curve over a 208 bit binary field
  c2tnb239v1: X9.62 curve over a 239 bit binary field
  c2tnb239v2: X9.62 curve over a 239 bit binary field
  c2tnb239v3: X9.62 curve over a 239 bit binary field
  c2pnb272w1: X9.62 curve over a 272 bit binary field
  c2pnb304w1: X9.62 curve over a 304 bit binary field
  c2tnb359v1: X9.62 curve over a 359 bit binary field
  c2pnb368w1: X9.62 curve over a 368 bit binary field
  c2tnb431r1: X9.62 curve over a 431 bit binary field
  wap-wsg-idm-ecid-wtls1: WTLS curve over a 113 bit binary field
  wap-wsg-idm-ecid-wtls3: NIST/SECG/WTLS curve over a 163 bit binary field
  wap-wsg-idm-ecid-wtls4: SECG curve over a 113 bit binary field
  wap-wsg-idm-ecid-wtls5: X9.62 curve over a 163 bit binary field
  wap-wsg-idm-ecid-wtls6: SECG/WTLS curve over a 112 bit prime field
  wap-wsg-idm-ecid-wtls7: SECG/WTLS curve over a 160 bit prime field
  wap-wsg-idm-ecid-wtls8: WTLS curve over a 112 bit prime field
  wap-wsg-idm-ecid-wtls9: WTLS curve over a 160 bit prime field
  wap-wsg-idm-ecid-wtls10: NIST/SECG/WTLS curve over a 233 bit binary field
  wap-wsg-idm-ecid-wtls11: NIST/SECG/WTLS curve over a 233 bit binary field
  wap-wsg-idm-ecid-wtls12: WTLS curvs over a 224 bit prime field
  Oakley-EC2N-3:
        IPSec/IKE/Oakley curve #3 over a 155 bit binary field.
        Not suitable for ECDSA.
        Questionable extension field!
  Oakley-EC2N-4:
        IPSec/IKE/Oakley curve #4 over a 185 bit binary field.
        Not suitable for ECDSA.
        Questionable extension field!

一位善良的密码学家能否向我指出哪些曲线仍然被认为是安全的?

3个回答

您误读了 Bernstein 和 Lange 的建议(诚然,他们的介绍有点误导,带有可怕的红色“错误”标签)。他们的意思不是某些曲线本质上是不安全的,而是某些曲线的安全实现比其他曲线更容易(例如,关于库行为,当它遇到声称是有效曲线点的编码但不是)。

你真正想要的是这样的曲线:

  • 您将使用您的私钥委托给您的软件(您的 SSL 服务器)已正确实施,并且不会泄露您的私钥的详细信息;
  • 将实现互操作性。

对于 SSL 服务器证书,“椭圆曲线”证书将仅用于数字签名(ECDSA 算法)。服务器将只签署它自己生成的消息;并且,在任何情况下,涉及 ECDSA 中曲线的唯一“私有”操作是将常规基点(硬编码,因为它是曲线定义的一部分,因此是正确的)乘以服务器生成的随机值。因此,在您的用例中,不存在特定于使用曲线的私钥泄漏风险。如果您的 SSL 实现很差,那么所有曲线都会很差,而不仅仅是其中的一些。

“互操作性”意味着如果 SSL 客户端可以实际连接到您的服务器,您可能更喜欢它;否则,拥有 SSL 服务器将毫无意义。这大大简化了问题:在实践中,普通客户端仅支持两条曲线,在所谓的NSA Suite B中指定:这些是 NIST 曲线 P-256 和 P-384(在 OpenSSL 中,它们被指定为,分别是“prime256v1”和“secp384r1”)。如果您使用任何其他曲线,那么一些广泛使用的 Web 浏览器(例如 Internet Explorer、Firefox...)将无法与您的服务器通信。

使用 P-256 将麻烦降至最低。如果您觉得使用 384 位曲线可用的 256 位曲线威胁到您的男子气概,那么请使用 P-384:它会增加您的计算和网络成本(CPU 大约是 3 倍,一些额外的网络上的十几个字节),但这在实践中可能可以忽略不计(在 SSL 驱动的 Web 服务器中,沉重的成本是“Web”,而不是“SSL”)。

我会说坚持使用 secp521r1 - 甚至 DJB 都说P-521 是相当不错的 Prime,而且每个现代加密库都支持它。

同时,我们应该推动采用像 Curve25519 这样的非 NIST 曲线,这将是完全刚性的,不太容易出现实施错误,并且对于那些需要比 secp521r1 更快的解决方案的人来说,可能会成为不错的选择。

至少不要使用 secp112r1、secp112r2、secp128r1、secp128r2、secp160k1、secp160r1、secp160r2、secp192k1 曲线。根据NIST 的建议,它们对于安全应用来说太小了