Не удается подписать импортированный в AndroidKeyStore RSA закрытый ключ - PullRequest
2 голосов
/ 02 декабря 2019

Я пытаюсь использовать импортированный ключ хранилища ключей, чтобы подписать часть данных:

Мой ключ сначала создается вне AndroidKeyStore (это специально), а затем импортируется в AndroidKeyStore

используя следующий способ:

    val keyGen = KeyPairGenerator.getInstance("RSA")
    keyGen.initialize(2048)
    val keyPair = keyGen.generateKeyPair()

    val keyProtectionSign = KeyProtection.Builder(KeyProperties.PURPOSE_SIGN or //
            KeyProperties.PURPOSE_VERIFY).setDigests(KeyProperties.DIGEST_SHA256) //

            .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1) //
            .setSignaturePaddings(KeyProperties.SIGNATURE_PADDING_RSA_PKCS1)
            .build()
    keyStore.setEntry(signatureAlias,
            KeyStore.PrivateKeyEntry(keyPair.private, arrayOf(certificate)),
            keyProtectionSign)

После этого я пытаюсь использовать ключ для подписи:

val keyStore = KeyStore.getInstance("AndroidKeyStore")
    keyStore.load(null)
    val privateKey = keyStore.getKey(signatureAlias,null)
    val signature = Signature.getInstance("SHA256withRSA")
    signature.initSign(privateKey)
    signature.update(data)
    val sign = signature.sign()

Однако строка signature.initSign(privateKey) вызывает исключение: java.security.InvalidKeyException: Supplied key (android.security.keystore.AndroidKeyStoreRSAPrivateKey) is not a RSAPrivateKey instance

Если я не импортирую ключ в хранилище ключей Android и пытаюсь подписать его, он работает.

Если я генерирую ключ непосредственно в AndroidKeyStore, он также завершается с той же ошибкой.

Что не так с моим кодом? Почему я не могу подписать ключ RSA?

...