我正在尝试找到ECC公钥的长度。我读到ECC的公钥约为64个字节。我试图自我测试,但结果却与普通测试不同。前提是我正在使用此规范(secp256k1)。下面给出了我用来计算公钥长度的代码。
byte publicKeyLength [] = pk.getEncoded();
System.out.println(“ PK的长度为” + publicKeyLength.length); //它会打印311再见?
在此论坛上阅读的内容应该为64个字节。但是为什么当我测试它时,它可以提供311个字节?
答案 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中已经解释了压缩形式和未压缩形式之间的区别。