【问题标题】:Public key encoding changes公钥编码更改
【发布时间】:2018-08-08 09:50:12
【问题描述】:

我已经使用椭圆曲线生成了一个公钥,但是每当我获得密钥的编码时,它就会改变。我想将编码用于我正在实施的区块链的公共地址。见下文

import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PublicKey;
import java.security.spec.ECGenParameterSpec;

class Scratch {
    public static void main(String[] args) throws Exception {
        KeyPairGenerator keyGen = KeyPairGenerator.getInstance("EC");
        ECGenParameterSpec ecSpec = new ECGenParameterSpec("secp256k1");
        keyGen.initialize(ecSpec);
        KeyPair kp = keyGen.generateKeyPair();

        PublicKey k = kp.getPublic();
        byte[] one = k.getEncoded();
        byte[] two = k.getEncoded();

        System.out.println(one);
        System.out.println(two);

    }
}

有输出

[B@4eec7777
[B@3b07d329

有人知道为什么会这样吗?我的猜测是这是预期的行为,我只是在这里误解了一些基本的东西。

【问题讨论】:

标签: encoding cryptography blockchain elliptic-curve encryption-asymmetric


【解决方案1】:

您正在打印byte[] 的内存地址,而不是密钥本身。您不能“打印”字节数组,因为它是二进制数据,您需要先以某种方式对其进行编码。 Hex 和 base64 都是显示二进制数据的好编码。对于内存,其他区块链实现喜欢使用 base58。

这是一个使用 base64 的示例:

String b64Str = Base64.getEncoder().encodeToString(one);
System.out.println(b64Str);

【讨论】:

  • 我不了解所有区块链,但比特币使用 address,它是仅公共 pointhash i>——不是 JCE 返回的公钥编码,它是由 X.509 定义的 ASN.1 结构 SubjectPublicKeyInfo,在 RFC3279 中更容易获得——并且通常显示它供人类使用base58(带有 4 字节冗余校验)。
  • @dave_thompson_085 啊,是的,我忘记了 base58,我只知道它不是 base64。谢谢指正。
猜你喜欢
  • 1970-01-01
  • 2015-02-23
  • 2012-08-23
  • 2012-06-13
  • 1970-01-01
  • 2020-02-08
  • 2017-04-16
  • 1970-01-01
  • 2012-05-09
相关资源
最近更新 更多