OpenSSL,至少在命令行中,以一种压缩格式转储椭圆曲线的公共部分。我一直无法找到一种方法将它作为x坐标和y坐标单独转储。关于这是否是其中一个"压缩"缺乏文档。我在RFC中看到的方法。如果是,那么我找不到用于转换为此压缩形式和从此压缩形式转换为原始坐标的过程。 OpenSSL使用什么方法?可以从命令行完成吗?
答案 0 :(得分:2)
ECC密钥的存储的公共点有两种主要格式,压缩和未压缩。 OpenSSL支持两者,但默认情况下写未压缩。
ec -text
选项显示输入文件中的任何内容,在stdout上以十六进制显示。 ec -conv_form
选项仅影响(PEM或DER)输出文件(可以是stdout或其他)中的内容,因为您指定了-noout
,所以没有PEM或DER输出。
所以你的问题实际上是关于输入,可能是压缩的。 正如您链接的OpenSSL联机帮助页所述,OpenSSL(如AFAICT其他所有人)使用在http://www.secg.org的高效密码学组文件中的文件SEC1中定义的ASN.1格式,其中“高效”意味着ECC和“Group”主要是指Certicom。 (相关RFC也链接到此文档,例如rfc 5480,用于X.509 / PKIX证书中的ECC公钥 。)
具体而言,
C.4表示publicKey
中的ECPrivateKey
字段与C.3(ECPublicKey
)相同,后者表示它是包含ECPoint
的BITSTRING,在C中定义.2参考2.3.3(et seq),其中说(除了无穷远处的点)它是
未压缩:八位字节04后跟X和Y坐标值(按顺序没有额外的框架)作为big-endian二进制整数,或
压缩:八位位组02或03后跟X坐标(仅)作为大端二进制整数,其中02和03之间的选择编码Y坐标是偶数还是奇数。
答案 1 :(得分:0)
openssl ecparam -name secp256k1 -out secp256k1.pem
openssl ecparam -in secp256k1.pem -genkey -noout -out secp256k1-key.pem
openssl ec -in secp256k1-key.pem -text -noout
或
openssl ec -in secp256k1-key.pem -text -noout -conv_form uncompressed
openssl ec -in secp256k1-key.pem -text -noout -conv_form compressed
-
P.S。你可以去wiki.openssl.org,有很多例子都有明确的解释。