公钥编码更改

时间:2018-08-08 00:33:47

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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

以下是使用base64的示例:

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