【发布时间】:2019-05-06 20:37:27
【问题描述】:
我需要生成这样的公钥并对字节进行额外的签名(这将包括这个之前生成的密钥)
我需要构造以下字节: 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 个字节
【问题讨论】:
标签: android kotlin cryptography bouncycastle ecdsa