与 ECC public 密钥的长度混淆
Confused with the length of ECC public key
我正在尝试查找 ECC public 密钥的长度。我读到ECC的public密钥大约是64字节。我试着自己测试一下,但结果与普通的不同。前提是我用的是这个规范(secp256k1)。下面给出了我用来计算 public 键长度的代码。
byte publicKeyLength[] =pk.getEncoded();
System.out.println("The Length of PK is " +publicKeyLength.length); // 它打印 311 byes?
正如我在这个论坛上看到的那样,它应该是 64 字节。但是为什么当我测试它时,它给出了 311 个字节?
如果你参考 rfc5480 你会看到你从 PublicKey::getEncoded
方法得到的字节实际上是 DER 编码的 SubjectPublicKeyInfo
:
SubjectPublicKeyInfo ::= SEQUENCE {
algorithm AlgorithmIdentifier,
subjectPublicKey BIT STRING
}
并且 subjectPublicKey
将是 DER OCTET 字符串编码的 ECPublicKey 并且此密钥由第一个字节组成,该字节决定密钥是否被压缩,然后是 [=22 的 X,Y 坐标=]关键EC点。
而X、Y字段的长度取决于该点定义在哪条曲线上。对于您的曲线,每个坐标将为 32 个字节。因此,在未压缩的形式下,原始密钥将有 65 个字节 (1 + 32 + 32)。 this SO question.
中解释了压缩和未压缩形式之间的区别
我正在尝试查找 ECC public 密钥的长度。我读到ECC的public密钥大约是64字节。我试着自己测试一下,但结果与普通的不同。前提是我用的是这个规范(secp256k1)。下面给出了我用来计算 public 键长度的代码。
byte publicKeyLength[] =pk.getEncoded();
System.out.println("The Length of PK is " +publicKeyLength.length); // 它打印 311 byes?
正如我在这个论坛上看到的那样,它应该是 64 字节。但是为什么当我测试它时,它给出了 311 个字节?
如果你参考 rfc5480 你会看到你从 PublicKey::getEncoded
方法得到的字节实际上是 DER 编码的 SubjectPublicKeyInfo
:
SubjectPublicKeyInfo ::= SEQUENCE {
algorithm AlgorithmIdentifier,
subjectPublicKey BIT STRING
}
并且 subjectPublicKey
将是 DER OCTET 字符串编码的 ECPublicKey 并且此密钥由第一个字节组成,该字节决定密钥是否被压缩,然后是 [=22 的 X,Y 坐标=]关键EC点。
而X、Y字段的长度取决于该点定义在哪条曲线上。对于您的曲线,每个坐标将为 32 个字节。因此,在未压缩的形式下,原始密钥将有 65 个字节 (1 + 32 + 32)。 this SO question.
中解释了压缩和未压缩形式之间的区别