自己生成的 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
类型的算法。由于您没有更改密钥的算法 - 开头的字节是相同的(它们指定相同的算法),这是预期的行为。
我正在尝试使用 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
类型的算法。由于您没有更改密钥的算法 - 开头的字节是相同的(它们指定相同的算法),这是预期的行为。