我已经使用椭圆曲线生成了一个公共密钥,但是每当我得到密钥的编码时,它就会改变。我想将编码用于我正在实现的区块链的公共地址。见下文
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
有人知道为什么会这样吗?我的猜测是这是预期的行为,在这里我只是误解了一些基本知识。
答案 0 :(得分:0)
您正在打印byte[]
的内存地址,而不是键本身。您不能“打印”字节数组,因为它是二进制数据,您需要先对其进行某种编码。 Hex和base64都是用于显示二进制数据的良好编码。对于内存,其他区块链实现都喜欢使用base58。
以下是使用base64的示例:
String b64Str = Base64.getEncoder().encodeToString(one);
System.out.println(b64Str);