Java 自行生成的公钥具有相同的开头

Java 自行生成的公钥具有相同的开头,java,cryptography,bouncycastle,bitcoin,elliptic-curve,Java,Cryptography,Bouncycastle,Bitcoin,Elliptic Curve,我试图用java生成一个“Secp256k1”密钥对 ECParameterSpec ecSpec = ECNamedCurveTable.getParameterSpec("secp256k1"); KeyPairGenerator g = KeyPairGenerator.getInstance("ECDSA", "BC"); g.initialize(ecSpec, new SecureRandom()); KeyPair keyPair = g.generateKeyPair(); P

我试图用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: 公开密钥:MFYWEAYKOZJ0CAQYFK4EEAAODQGAEX2WR3G1YTBDx8VJ+N121FFjn/YFbZ77ZumqVteTXAHnzN9fR+3NRD0EQ8kb+TnHvDMCtRR6a7GE8ckVVpajCrA==

尝试1: 公开密钥:MFYWEAYKOZJ0CAQYFK4EEAAODQGAEPZA5+ZD8XTD7U0IXLIYIGJCTVZGMQKEPQDF09PLTGCP9URDHOB/uWH9VGA+NJAUJNPTXR+njuDZy4JZw==

尝试2: 公开密钥:MFYWEAYKOZJ0CAQYFK4EEAAODQGAEBXCLGH0T7JSCFGFJNHAW6NFI4ACPAYTDD7TSREYKBOVGST8XBLA7X7UYDLBP3KNVG7E9X5AJFTD1DOYTJEA==

尝试3: 公开密钥:MFYWEAYKOZJ0CAQYFK4EEAAODQGAEACJKF861/P4yhsJnPMitSWiLNrbvBEYdB/pndY0ScUWdKfIPhA3qbHLTzYPROA7wiGbj2oS7joxYzhrrWb0rwA==

“MFYWEAYKZJ0CAQYFK4EEAAODQGAE”开头总是一样的,结尾是“=”


我肯定我错过了什么。有人知道为什么它总是以相同的32个字符开头吗

由于您使用的是
BouncyCastle
作为提供程序,因此您的公钥将是
BCECPublicKey
的实例。此类的
getEncoded
方法是一个已编码的
SubjectPublicKeyInfo
结构。定义如下:


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

这可能是嵌入到编码密钥中的曲线参数。
=
是base64填充。完全正常。相同类型的每个公钥的序言都是相同的,因为它用于标识该类型。这里没有需要解决的问题。由于AlgId是相同的,密钥长度也是相同的(对于X9.62格式的ECC也是如此,对于RSA也是如此,但对于其他一些算法则不是这样),因此DER编码的前缀是恒定的。这不仅仅是为了卑诗省;
SubjectPublicKeyInfo  ::=  SEQUENCE  {
   algorithm         AlgorithmIdentifier,
   subjectPublicKey  BIT STRING
}