Чтобы закодировать открытый ключ эллиптической кривой 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)
Вы не включаете все необходимые сведения о том, как подписать ключ и закодировать подпись, но я бы предпочел, чтобыстандартная подпись ECDSA на открытом ключе со стандартной кодировкой:
val signer = Signature.getInstance("SHA256withECDSA")
signer.initSign(otherPrivateKey)
signer.update(compressedPublicKey)
val signature = signer.sign()
Это хеширует открытый ключ с использованием SHA256, подписывает его с использованием ECDSA, форматирует и сериализует его в качестве кодировки DER структуры ASN.1 ECDSASignature.
ECDSASignature ::= SEQUENCE {
r INTEGER,
s INTEGER
}
r
и s
будут натуральными числами и закодированы с помощью DER.Есть и другие способы сделать это, но это, безусловно, самый распространенный способ (единственный другой распространенный формат подписи ECDSA - это просто заполнение нулями r и s и их объединение).