与ECC公钥的长度混淆

时间:2019-06-26 09:42:16

标签: java key public-key-encryption

我正在尝试找到ECC公钥的长度。我读到ECC的公钥约为64个字节。我试图自我测试,但结果却与普通测试不同。前提是我正在使用此规范(secp256k1)。下面给出了我用来计算公钥长度的代码。

byte publicKeyLength [] = pk.getEncoded();

System.out.println(“ PK的长度为” + publicKeyLength.length); //它会打印311再见?

在此论坛上阅读的内容应该为64个字节。但是为什么当我测试它时,它可以提供311个字节?

1 个答案:

答案 0 :(得分:1)

如果您引用rfc5480,将会看到从PublicKey::getEncoded方法获得的字节实际上是DER编码的SubjectPublicKeyInfo

SubjectPublicKeyInfo  ::=  SEQUENCE  {
       algorithm         AlgorithmIdentifier,
       subjectPublicKey  BIT STRING
}

然后subjectPublicKey将是DER OCTET字符串编码的ECPublicKey,此密钥由第一个字节(即确定该密钥是否已压缩的on)组成,然后是公用密钥EC点的X,Y坐标。

X,Y字段的长度取决于定义该点的曲线。对于您的曲线,每个坐标为32个字节。因此,以未压缩形式的原始密钥将具有65个字节(1 + 32 + 32)。 this SO question中已经解释了压缩形式和未压缩形式之间的区别。