自定义椭圆曲线可以用于常见的 TLS 实现吗?

信息安全 tls 电子抄送
2021-08-20 12:41:44

最近的发展对NIST 指定的椭圆曲线产生了一些 疑问,并在许多标准中使用,如 TLS(用于与 ECDSA 的签名和与 ECDHE 的密钥协议)。

似乎该标准允许在握手期间传输的自定义、服务器生成的 ECDH 曲线(就像非椭圆 DH 一样)。

  • 常见的实现是否真的支持这一点,或者它们是否仅限于 NIST 指定的曲线?我用 Google Chrome 和 iOS 跟踪了 TLS 握手;似乎 elliptic_curves 扩展只指定了曲线secp{256,384,521}r1,而不是arbitrary_explicit_{prime,char2}_curves

  • 椭圆曲线证书的情况如何?TLS 似乎需要符合 RFC3279 或任何替代它的 RFC(即 RFC5480)的 X.509 证书。根据RFC3279,这是可能的;RFC5480中,明确排除了显式或隐式曲线

一般而言,当今标准(TLS、S/MIME 等)允许自定义椭圆曲线并得到各种实现(OpenSSL、NSS、专有的)支持的程度如何?

如果它们不受支持:为什么?找到“好”曲线比找到合适的 DH 参数更难吗?通用曲线是否更容易验证和/或实施?他们更快吗?

2个回答

NIST 有“定义”的 15 条“标准曲线”,在FIPS 186-4中指定。实际上,他们并没有自己定义它们;他们从SEC继承了它们。这 15 条曲线聚合为 3 组:

  • P-* 曲线在“素数域”中工作(点坐标是以素数p为模的整数)。
  • B-* 曲线在“二进制域”中工作(点坐标是GF(2 m )中的值)。
  • K-* 曲线与 B-* 曲线在相同的领域工作,但具有允许更快计算的特殊结构。

NIST 发现,出于各种原因,人们非常不愿意支持这 15 条曲线,更不用说“一般”曲线了:

  • 所涉及的数学被认为是“难”的(这比 RSA 或普通的 Diffie-Hellman 更难掌握)。
  • ...对于二进制字段中的曲线更是如此。
  • 虽然可以编写“通用”曲线处理代码,但针对特定曲线的代码通常更易于实现且速度更快。特别是,P-* 曲线工作模素值,其格式使实现更有效(快速模减少)。
  • 专利的重复性和长期存在的权利要求,使得椭圆曲线的使用“有风险”。
  • ...尤其适用于二进制域中的曲线;
  • ...更一般地,对于选择具有某些有利于实现的特性的通用曲线。目前尚不清楚曲线是否可以申请专利(与特殊曲线结构支持的实现技术相反),但不确定性已经起到了强大的劝阻作用。

因此,人们对实现对椭圆曲线的通用支持持谨慎态度,因为它似乎很难,不利于性能,而且是一个合法的雷区。坚持一些更简单的曲线似乎更容易、更快、更安全;这就是发生的事情。NIST(好吧,NSA)将这一趋势正式化为他们的“套件 B ”密码学套件,它要求执行两条曲线:P-256 和 P-384。

在 SSL/TLS 和 X.509 中,可以使用任意曲线。但是,大多数实现不支持任意曲线。OpenSSL 支持所有 15 条 NIST 曲线,但不支持任意曲线。Firefox 仅支持 P-256 和 P-384;我不确定微软的代码(Windows,因此是 Internet Explorer)是否会接受更多(也许 P-521 也是如此)。如果您尝试使用除 P-256 或 P-384 之外的任何其他曲线,那么您将遇到互操作性问题(比尝试使用椭圆曲线所遇到的问题更多)。一些标准编写者认为他们必须“实用”,已经完全承认了这一事实,并且只是禁止使用其他曲线,正如您在RFC 5480中看到的那样。


生成自己的曲线并不难,但比生成自己的 DH 参数要困难得多。它涉及使用Schoof 算法或其变体进行点计数。您将无法在一小时和一百行 Java 代码中拼凑出一个曲线生成器,而生成 DH 参数可以在这些限制下完成。计算成本也更高(您仍然会在一分钟内获得漂亮的曲线,但不会在 100 毫秒内)。简而言之,人们不会经常这样做,或者根本不会这样做。

有多个曲线族。

NIST 的选择是关于素数场 (y^2 = x^3 + ax + b) %p 的短 Weiertstrass 方程,阶数为 n,辅因子 h。

SSL 中的自定义曲线是为同一方程选择不同的 a、b、p、n、h

NIST 二进制域是一个不同的曲线族

ed25519 来自扭曲爱德华曲线家族

c25519 是来自 montgomery 曲线族的曲线

对于每个家族,在一个协议交换中你需要的参数不止几个,你还需要源代码来实现它们。新代码不会在您的 TLS/SSL 库中自行生成。您必须等待开源社区采用新的曲线系列。然后,您还需要与产品维护人员不情愿地夸大其源代码作斗争。你可以在这里找到越来越多的曲线族https://hyperelliptic.org/EFD/,最快的可能是 Huff 曲线,没有列出。