java - 对ECC公钥的长度感到困惑

标签 java key public-key-encryption

我正在尝试查找 ECC 公钥的长度。我读到ECC的公钥大约是64字节。我尝试自己测试一下,但结果与常见的不同。前提是我使用的是这个规范(secp256k1)。下面给出了我用来计算公钥长度的代码。

byte publicKeyLength[] =pk.getEncoded();

System.out.println("PK的长度为"+publicKeyLength.length);//它打印 311 字节?

正如我在这个论坛中读到的,它应该是 64 字节。但是为什么当我测试它时,它给出了311字节?

最佳答案

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

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

并且 subjectPublicKey 将是 DER OCTET 字符串编码的 ECPublicKey,该 key 由第一个字节组成,该字节是确定 key 是否被压缩的字节,然后是公钥的 X、Y 坐标EC点。

X、Y 字段的长度取决于该点定义在哪条曲线上。对于您的曲线,每个坐标为 32 个字节。因此,在未压缩的形式下,原始 key 将有 65 个字节 (1 + 32 + 32)。压缩和未压缩形式之间的差异已在this SO question中进行了解释。 .

关于java - 对ECC公钥的长度感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56769712/

相关文章:

mysql - MySQL 中的键有什么用?

java - Sentinel 问题与循环允许在 java 中输入 quit 来结束程序

haskell - yesod 如何显示 PersistInt64 键的纯值

java - 如何从 Eclipse Build Workspace 跳过 Maven 插件执行

java - 如何将此代码片段变形为逻辑取决于索引值的 Java 8?

ssl - 证书颁发机构 (CA) 如何验证公钥证书中主体的身份?

Java:Key类型和String之间的转换

c - 在 C 语言中用于 RSA 解密的 OpenSSL EVP api 的 EVP_OpenInit() 中出现错误

java - MTOM - 根内容类型始终为文本/xml

java - 在 Java 中立即中断用户输入?