Public 密钥编码更改

Public key encoding changes

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

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

有谁知道为什么会这样?我的猜测是这是预期的行为,我只是误解了这里的一些基本内容。

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

这里是一个使用 base64 的例子:

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