Как подписать данные с помощью закрытого ключа ECDSA с помощью кривой P-256 (secp256k1) в Android Kotlin?Android

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Как подписать данные с помощью закрытого ключа ECDSA с помощью кривой P-256 (secp256k1) в Android Kotlin?

Сообщение Anonymous »

Я хотел подписать шестнадцатеричные данные, используя закрытый ключ 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Ошибка EVP_DigestVerifyFinal — ECDSA P-256/SHA-256 с OpenSSL (Libcrypto)
    Anonymous » » в форуме C++
    0 Ответы
    27 Просмотры
    Последнее сообщение Anonymous
  • Ошибка EVP_DigestVerifyFinal — ECDSA P-256/SHA-256 с OpenSSL (Libcrypto)
    Anonymous » » в форуме C++
    0 Ответы
    36 Просмотры
    Последнее сообщение Anonymous
  • Как подписать полезную нагрузку с помощью закрытого ключа PSA в Котлине
    Anonymous » » в форуме Android
    0 Ответы
    55 Просмотры
    Последнее сообщение Anonymous
  • Как получить открытый ключ эллиптической кривой из закрытого ключа
    Anonymous » » в форуме Python
    0 Ответы
    21 Просмотры
    Последнее сообщение Anonymous
  • ValueError:Tensor("входные данные:0", shape=(None, 256, 256, 3), dtype=uint8)
    Anonymous » » в форуме Python
    0 Ответы
    23 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Android»