Java 自行生成的公钥具有相同的开头
我试图用java生成一个“Secp256k1”密钥对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
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
}