Encoding 公钥编码更改

Encoding 公钥编码更改,encoding,cryptography,blockchain,elliptic-curve,encryption-asymmetric,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 m

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

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

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

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

下面是一个使用base64的示例:

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

Dupe和许多其他人我不知道所有的区块链,但比特币使用的地址只是公共点的散列,而不是JCE返回的公钥编码,这是由X.509定义的ASN.1结构
SubjectPublicKeyInfo
,在RFC3279中更容易获得,并且通常在base58中显示供人使用(带有4字节冗余校验)。@dave_thompson_085啊是的,我忘了base58,我只知道它不是base64。谢谢你的更正。