Я хотел подписать шестнадцатеричные данные, используя закрытый ключ ECDSA с кривой P-256 (secp256k1). Но большинство методов в Android используют закрытый ключ в кодировке PKCS#8 для генерации подписи. Как преобразовать закрытый ключ ECDSA с кривой P-256 (secp256k1) в PKCS#8, закодированный в Android Kotlin?
Текущий формат закрытого ключа: - ----BEGIN ЧАСТНЫЙ КЛЮЧ EC-----\nMHQCAQEEIKUpeefDapsFwkh3nvxEtDkkh3eA......-----КОНЕЦ ЧАСТНОГО КЛЮЧА EC -----
Обязательно Формат закрытого ключа: -----BEGIN PRIVATE KEY-----\nMHQCAQEEIKUpeefDapsFwkh3nvxEtDkkh3eA......-----END PRIVATE KEY -----
Я не могу использовать Bouncy Castle, поскольку targetSdkVersion моего проекта равна 33.
Я также попробовал следующий метод для анализа закрытого ключа и генерации подписи, но получал сообщение «java.security.spec.InvalidKeySpecException: com.android.org» .conscrypt.OpenSSLX509CertificateFactory$ParsingException: ошибка анализа закрытого ключа"
fun parseECPrivateKey(pem: String): PrivateKey {
// Remove the header and footer from the PEM string
val privateKeyPEM = pem
.replace("-----BEGIN EC PRIVATE KEY-----", "")
.replace("-----END EC PRIVATE KEY-----", "")
.replace("\\s".toRegex(), "")
// Decode the Base64 encoded string
val encoded = Base64.getDecoder().decode(privateKeyPEM)
// Use KeyFactory to convert the PKCS8 encoded key into a PrivateKey object
val keyFactory = KeyFactory.getInstance("EC")
val keySpec = PKCS8EncodedKeySpec(encoded)
return keyFactory.generatePrivate(keySpec)
}
fun signData(privateKey: PrivateKey, dataHex: String): ByteArray {
val data = hexStringToByteArray(dataHex)
val signature = Signature.getInstance("SHA256withECDSA")
signature.initSign(privateKey)
signature.update(data)
return signature.sign()
}
fun hexStringToByteArray(hex: String): ByteArray {
val len = hex.length
val data = ByteArray(len / 2)
for (i in 0 until len step 2) {
data[i / 2] = ((Character.digit(hex, 16) shl 4)
+ Character.digit(hex[i + 1], 16)).toByte()
}
return data
}
fun main() {
val privateKeyPem = """
-----BEGIN EC PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg0m4yLz+sdzZtBG9Q
HQ9++wcfq1O4hOWgSBMb/A6eijyhRANCAAQeB0fBl2D7HZOKVBjpPiU2jabzNxQU
ZYrJ+MSA3LpzZxmRk2JaFHNujjkJghQT19HHjg3Fnkb8Y9oIhB9neXBI
-----END EC PRIVATE KEY-----
""".trimIndent()
val dataHex = "48656c6c6f2c20576f726c6421" // Example data
try {
val privateKey = parseECPrivateKey(privateKeyPem)
val hash = hexStringToByteArray(dataHex)
val signature = signData(privateKey, hash)
println("Signature: ${Base64.getEncoder().encodeToString(signature)}")
} catch (e: Exception) {
e.printStackTrace()
}
}
Подробнее здесь: https://stackoverflow.com/questions/785 ... curve-in-a
Как подписать данные с помощью закрытого ключа ECDSA с помощью кривой P-256 (secp256k1) в Android Kotlin? ⇐ Android
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как подписать полезную нагрузку с помощью закрытого ключа PSA в Котлине
Anonymous » » в форуме Android - 0 Ответы
- 55 Просмотры
-
Последнее сообщение Anonymous
-
-
-
ValueError:Tensor("входные данные:0", shape=(None, 256, 256, 3), dtype=uint8)
Anonymous » » в форуме Python - 0 Ответы
- 23 Просмотры
-
Последнее сообщение Anonymous
-