自己生成的 Public 键确实有相同的开头

Self generated Public Keys do have the same beginning

我正在尝试使用 java 生成 "Secp256k1" 密钥对。

ECParameterSpec ecSpec = ECNamedCurveTable.getParameterSpec("secp256k1");
KeyPairGenerator g = KeyPairGenerator.getInstance("ECDSA", "BC");
g.initialize(ecSpec, new SecureRandom());
KeyPair keyPair = g.generateKeyPair();

PrivateKey privateKey = keyPair.getPrivate();
PublicKey publicKey = keyPair.getPublic();

System.out.println(Base64.getEncoder().encodeToString(privateKey.getEncoded()));

System.out.println(Base64.getEncoder().encodeToString(publicKey.getEncoded()));

但是如果我查看输出,我的密钥对总是看起来很相似。

尝试 0: 公钥:MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEx2WR3g1ytBdx8VJ+N121FFjn/YFbZ77ZumqVteTXAHnzN9fR+3NRD0EQ8kb+TnHvDMCtRR6a7GE8ckVVpajCrA==

尝试 1: 公钥:MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEpzA5+Zd8xtD7UH0IxlIyIGIFCjctvzGMqBKEpqDf09PLTGcp9UrDHOB/uWH9VGA+nJAUjnPtxSR+njuDZy4JZw==

尝试 2: 公钥:MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEbXclGh0T7jScfGfJNhAw6MnFI4AcpAytdd7TsrEykbOVGsT8xBla7x7uYdlBp3KNVQPG7E9X5Ajftd1dOyTjeA==

尝试 3: 公钥:MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEACJKf861/P4yhsJnPMitSWiLNrbvBEYdB/pndY0ScUWdKfIPhA3qbHLTzYPROA7wiGbj2oS7joxYzhrrWb0rwA==

"MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE"开头总是一样的,结尾都是“==”

我确定我遗漏了什么。有人知道为什么它总是以相同的 32 个字符开头吗?

由于您使用 BouncyCastle 作为提供商,您的 public 密钥将是 BCECPublicKey 的实例。此 class 的 getEncoded 方法返回编码的 SubjectPublicKeyInfo 结构。这是在 RFC5480 中定义的:

SubjectPublicKeyInfo  ::=  SEQUENCE  {
   algorithm         AlgorithmIdentifier,
   subjectPublicKey  BIT STRING
}

该结构的第一个字段是AlgorithmIdentifier类型的算法。由于您没有更改密钥的算法 - 开头的字节是相同的(它们指定相同的算法),这是预期的行为。