java - 对 ECC 公钥的长度感到困惑
问题描述
我正在尝试查找 ECC 公钥的长度。我读到 ECC 的公钥大约是 64 个字节。我试图测试我自己,但结果与常见的不同。前提是我使用的是这个规范(secp256k1)。下面给出了我用来计算公钥长度的代码。
字节 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,该密钥由第一个字节组成,该字节确定密钥是否被压缩,然后是公钥 EC 点的 X、Y 坐标。
X、Y 场的长度取决于定义点的曲线。对于您的曲线,每个坐标将是 32 个字节。因此,未压缩形式的原始密钥将有 65 个字节 (1 + 32 + 32)。这个 SO question已经解释了压缩和未压缩形式之间的区别。
推荐阅读
- javascript - 浏览器大小更改时 HTML 网站重新加载
- node.js - 运行 npm install run 时出错
- javascript - Keydown 事件未按预期工作。图像静止不动?
- filter - 当带有过滤器选项的 ForEach 在 Swiftui 中没有显示结果时,如何显示文本?
- google-apps-script - 如何获取将 Google 联系人导入 Google 表格的脚本?
- c++ - 错误 LNK2001:未解析的外部符号“受保护:从 VS 2010 升级到 VS 2017 时的静态枚举正则表达式
- python - selenium、python 和 chrome 的多个错误
- php - 优化 ram 使用 Laravel,将 Cronjobs 拆分成块?
- docker - 如何防止 github.com/ory/dockertest 将容器分配给随机端口?
- vim - 查看是否有 vim 帮助文件的函数