我需要生成这样的公钥并对字节进行额外的签名(这将包括之前生成的 key )
我需要构造字节: ASN.1 前缀 + 签名(33 字节压缩 NIST P-256 公钥)
签名应该从其他定义的私钥传递
ECDSA 规范:
● 曲线:
NIST P-256 也称为 secp256r1 和 prime256v1 (openssl)
● 签名格式 ASN.1。 ECDSA 签名的 r 和 s 值必须为正 整数和 DER 编码。
Android 中是否有 API 可以执行此过程?那我该如何使用呢?
我尝试过的:
try {
val generator = KeyPairGenerator.getInstance("ECDSA")
val ecSpec = ECNamedCurveTable
.getParameterSpec("prime256v1")
generator.initialize(ecSpec)
val keyPair = generator.generateKeyPair()
val privKey = keyPair.private
val encodedPrivKey = privKey.encoded
System.out.println(toHex(encodedPrivKey))
val pubKey = keyPair.public
val encodedPubKey = pubKey.encoded
System.out.println(toHex(encodedPubKey))
val keyFactory = KeyFactory.getInstance("ECDSA")
val pubKey2 = keyFactory.generatePublic(X509EncodedKeySpec(encodedPubKey))
if (Arrays.equals(pubKey2.getEncoded(), encodedPubKey)) {
println("That worked for the public key")
}
val privKey2 = keyFactory.generatePrivate(PKCS8EncodedKeySpec(encodedPrivKey))
if (Arrays.equals(privKey2.getEncoded(), encodedPrivKey)) {
println("That worked for the private key")
}
} catch (e: GeneralSecurityException) {
throw IllegalStateException(e)
}
此处 - 编码后的公钥长度为 90 个字节,我想我希望它是 33 个字节
最佳答案
以压缩格式对 Bouncy CaSTLe 椭圆曲线公钥进行编码:
Security.addProvider(BouncyCastleProvider())
generator = KeyPairGenerator.getInstance("ECDSA")
val ecSpec = ECNamedCurveTable.getParameterSpec("prime256v1")
generator.initialize(ecSpec)
val keyPair = generator.generateKeyPair()
val publicKey = keyPair.public as org.bouncycastle.jce.interfaces.ECPublicKey
val compressedPublicKey = publicKey.q.getEncoded(true)
您没有包括有关如何签署 key 和对签名进行编码的所有必要详细信息,但我最好的猜测是使用标准编码对公钥进行标准 ECDSA 签名:
val signer = Signature.getInstance("SHA256withECDSA")
signer.initSign(otherPrivateKey)
signer.update(compressedPublicKey)
val signature = signer.sign()
这使用 SHA256 对公钥进行哈希处理,使用 ECDSA 对其进行签名,并将其格式化并序列化为 ASN.1 结构 ECDSASignature 的 DER 编码。
ECDSASignature ::= SEQUENCE {
r INTEGER,
s INTEGER
}
r
和 s
将是正整数并使用 DER 编码。还有其他方法可以做到这一点,但这是迄今为止最常见的方法(唯一其他常见的 ECDSA 签名格式只是用零填充 r 和 s 并将它们连接起来)。
关于android - 如何生成 33 字节压缩的 NIST P-256 公钥?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53629537/