就像在这个例子中建议的那样,椭圆曲线由素数p定义,它是有限域的元素数和一个方程:曲线 = y² = x³ + ax + b
在实际情况下,例如对于 Google 证书,是否可以使用 OpenSSL找到a、b、p** ?我试过谷歌搜索并自己找到这个答案,但我发现了什么。
就像在这个例子中建议的那样,椭圆曲线由素数p定义,它是有限域的元素数和一个方程:曲线 = y² = x³ + ax + b
在实际情况下,例如对于 Google 证书,是否可以使用 OpenSSL找到a、b、p** ?我试过谷歌搜索并自己找到这个答案,但我发现了什么。
在证书中表示 EC参数有三种方式。我将讨论最常用的:显式参数和命名曲线。
显式 EC(域)参数正是顾名思义:它们是直接放入证书中的值。读取公钥的应用程序可以直接从域参数和公共点 W 的值中创建完整的 EC 公钥。
然而,命名曲线仅标识先前指定的一组域参数。它们通常在软件中简单地表示为字符串。然而,在证书和其他 ASN.1 DER 对象中,它们由 ASN.1 OID 表示。OID 是 1.2.3 等形式的唯一字符串,首先代表注册办公室,然后是组织等。
如果您将 Google 证书放入 ASN.1 解析中,您会发现其中一个 OID,已经有效地转换为字符串:
openssl asn1parse -in google_ec.cer
将产生:
...
251:d=3 hl=2 l= 19 cons: SEQUENCE
253:d=4 hl=2 l= 7 prim: OBJECT :id-ecPublicKey
262:d=4 hl=2 l= 8 prim: OBJECT :prime256v1
...
快速搜索会找到RFC 5480,它指的是 secp256r1(参见 2.4.2)或 NIST P-256 椭圆曲线。后两者定义了曲线的所有参数,当然 W 除外。通常,从现有软件中找到这些曲线参数会更容易,尽管标准可能无法以对您的特定运行时环境有用的格式来表示它们。